2016-10-19 110 views
1

我想構建一個基於ASP.NET Core的WebApi來訪問數據庫中的數據。該WebApi可以以兩種方式使用,既可以作爲公共WebApi使用,也可以作爲Web應用程序的身份驗證或私有後端服務。在後一種情況下,不需要驗證,因爲只有經過驗證的用戶才能訪問Web應用程序,並且Web應用程序和WebApi都將在同一臺計算機上運行,​​WebApi將隱藏在外部。具有可選身份驗證/授權的ASP.NET核心

由於我們需要對第一個場景進行身份驗證,因此我將使用Authorize屬性標記所有公共API。但對於私人場景,我想繞過任何身份驗證。

有什麼辦法可以使認證可選取決於配置中的一些標誌?

更新兩個

來講使用場景我的意思是兩個完全獨立的安裝!每個人都有自己的配置文件。需要進行身份驗證的決定是在一次安裝中,不是每次安裝都進行安裝!我的目標是在配置中只有一個代碼庫和一個開關。

+0

Coul ðdownvoter請評論我做錯了什麼問這個問題或我問的方式? – NicolasR

回答

3

如果你繞過認證,你如何區分內部或公共的API請求?這會導致安全漏洞。所以你不應該繞過認證。

如果您在mvc應用程序中使用openidconnect身份驗證,則可以設置SaveTokens=true。它使您能夠將訪問令牌存儲在Cookie中。當你在mvc動作中調用api時,你可以發送這個access_token到api。

另一種方式使用兩個不同的認證中間件,一個用於公共訪問的內部另一個(這很難實現)。

我會用第一種方法。

更新

爲了實現自己的目標,一個取巧的辦法來了我的腦海裏,但我不知道這是好辦法:

創建一個過濾器供應商:

public class EncFilterProvider : IFilterProvider 
{ 
    public int Order 
    { 
     get 
     { 
      return -1500; 
     } 
    } 

    public void OnProvidersExecuted(FilterProviderContext context) 
    { 
    } 

    public void OnProvidersExecuting(FilterProviderContext context) 
    { 
     // remove authorize filters 
     var authFilters = context.Results.Where(x => 
      x.Descriptor.Filter.GetType() == typeof(AuthorizeFilter)).ToList(); 
     foreach(var f in authFilters) 
      context.Results.Remove(f); 
    } 
} 

然後根據配置值有條件地註冊它

public void ConfigureServices(IServiceCollection services) 
    { 
     if(config["servermode"] = "internal") 
     { 
      services.AddScoped<IFilterProvider, EncFilterProvider>(); 
     } 
    } 
+0

我不想在運行時爲每個請求區分內部或公共請求!我認爲可以通過配置繞過我的私有實例的身份驗證。例如從appsettings中讀出一個值。json告訴我是否應該使用認證。我可能無法通過配置打開/關閉Authorize屬性。也許我可以避免在啓動時添加授權中間件,具體取決於我的配置。實現我自己的中間件當然能夠解決問題,但正如你所說,可能太難以爲我實現。 – NicolasR

+0

假設您無論如何繞過內部請求的身份驗證(可能是ip控制或簽名請求)。在這種情況下,你不需要在api action中獲取當前用戶嗎? –

+0

不,對於我的WebApi的私人實例,只有一個客戶端,這是我的Web應用程序,它是可信的,因此它可以訪問所有內容,並且在WebApi中沒有我必須識別的用戶設置,它只是關於訪問控制。其實Web應用程序處理認證/授權。另請參閱我的問題更新... – NicolasR

0

我會建議認證這兩個應用程序:Web應用程序和Web API之一。你將擁有一切安全。 用於跳過認證不是一個好主意。只需爲您的Web應用程序創建一個用戶(在Web API應用程序中),該用戶將用於從Web API獲取數據時進行身份驗證。

+0

問題是我打算使用IdentityServer作爲外部令牌提供程序。對於我的WebApi的內部實例來說,這意味着每次請求都會往返IdentityServer,儘管可信Web應用程序是唯一可以連接到此WebApi實例的客戶端。 – NicolasR