将Scott Wildermuth的World Trip应用程序升级到ASP.NET Core 2.0。以下代码无效。
由于我使用两种身份验证类型,并且我希望两者都能使用api控制器,因此我决定使用授权策略。
public void ConfigureServices(IServiceCollection services)
{
//Some code 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
}
}
来自客户端(web)的带有cookie身份验证的请求从未被视为经过身份验证,而来自Jwt身份验证的客户端的请求按预期工作。
如果我在控制器上使用简单的[Authorize]
,它只适用于cookie身份验证,其中asp.net核心只选择默认的cookie身份验证,并且永远不会接受来自Jwt客户端的请求。
答案 0 :(得分:1)
policy.AddAuthenticationSchemes(scheme1, scheme2)
这意味着为了使策略验证成功,两个指定的验证方案必须成功。
您可能设置了两种身份验证方案,以便在JWT身份验证成功时,它会自动成功进行cookie身份验证(在这种情况下设置cookie,因此在进一步请求时不再需要JWT令牌,但cookie是足够)。因此,当JWT身份验证成功时,cookie身份验证也会成功。但是,情况恰恰相反:如果您只使用cookie来建立身份验证,那么JWT令牌可能根本就不存在。
如果您不关心哪个身份验证方案提供了身份验证,则应该删除AddAuthenticationSchemes
来电。通过说policy.RequireAuthenticatedUser()
,您基本上说需要某些身份验证方案才能成功验证用户。
这是顺便说一句。完全相同的行为,默认策略(只有[Authorize]
)有。