2017-09-12 48 views
0

將Scott Wildermuth的World Trip應用程序升級到ASP.NET Core 2.0。下面的代碼不起作用。Cookie身份驗證不適用於asp.net核心中的授權政策

由於我使用兩種認證類型,我會喜歡這兩種工作的API控制器,我決定使用授權策略。

public void ConfigureServices(IServiceCollection services) 
{ 
    //Some codes here 
    services.AddAuthentication() 
     .AddCookie() 
     .AddJwtBearer(**Implementation is fine**); 

    services.AddAuthorization(options => 
    { 
     options.AddPolicy("Authenticated", policy => 
     { 
      policy.AddAuthenticationSchemes(
       CookieAuthenticationDefaults.AuthenticationScheme, 
       JwtBearerDefaults.AuthenticationScheme) 
        .RequireAuthenticatedUser(); 
     }); 
    }); 
} 
在我的控制器

現在,

namespace TheWorld.Controllers.Api 
{ 
    [Route("api/trips")] 
    [Authorize(policy: "Authenticated")] 
    public class TripsController : controller 
    { 
     // Implementation is fine 
    } 
} 

請求從客戶端(網頁)來與cookie認證是從未見過的認證,同時從智威湯遜請求驗證客戶端正常工作。

如果我在控制器上使用簡單[Authorize],它只適用於cookie身份驗證,其中asp.net核心只選擇默認的cookie身份驗證,並且從不接受來自Jwt客戶端的請求。

回答

0
policy.AddAuthenticationSchemes(scheme1, scheme2) 

這意味着,爲了使政策能夠成功地認證,指定的認證方案必須成功。

您的兩個身份驗證方案可能會建立,以便當JWT身份驗證成功時,它會自動成功進行cookie身份驗證(在此情況下設置cookie,所以在進一步請求JWT令牌不再需要時,Cookie足夠)。所以當JWT認證成功時,cookie認證也是成功的。但是,情況卻並非如此:如果您僅使用cookie來建立身份驗證,那麼JWT令牌可能根本就不存在。

如果您不在乎其中驗證方案提供了驗證,您應該刪除AddAuthenticationSchemes呼叫。通過說policy.RequireAuthenticatedUser()你基本上說,需要有一些驗證方案,成功驗證用戶。

這是BTW。完全相同的行爲,默認策略(只有[Authorize])具有。

+0

謝謝@poke。我已經嘗試過你提到過的情況,在這種情況下發生的事情是'CookieAuthentication'被選爲默認值,'JwtBearer'從未被使用過。 謝謝。 –

+0

謝謝@poke。我終於發現問題出自'AspNetCore.Identity'。隨附的默認'AuthenticationScheme'使用方案名「'Identity.Application」'。 因此,在將'CookieAuthenticationDefaults.AuthenticationScheme'改爲'「Identity.Application」後,應用程序工作,無論是否調用「services.AddAuthentication」上的'.AddCookie'。 –