【发布时间】:2023-04-04 04:30:01
【问题描述】:
我已经按照here 提供的文档实现了一个自定义 IAuthorizationPolicyProvider,但是当我调试并到达处理程序并查看 context.User 对象时,我看到 IsAuthenticated 或 context.User.IsInRole 等属性是 false/空的。我的应用程序配置了 jwt 令牌授权,并且我已确认该令牌确实包含角色有效负载数据中的值,但它似乎在到达处理程序以供我使用这些值之前进行身份验证。有人可以帮助我了解操作顺序,或者我如何能够逐步完成实际发生的身份验证吗?
我的 Startup.cs 中有身份验证和授权:
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
services.AddAuthorization(options =>
{
var defaultAuthorizationBuilder = new AuthorizationPolicyBuilder("Bearer");
defaultAuthorizationBuilder = defaultAuthorizationBuilder.RequireAuthenticatedUser();
options.DefaultPolicy = defaultAuthorizationBuilder.Build();
}
services.AddSingleton<IAuthorizationPolicyProvider, MyCustomPolicyProvider>();
services.AddSingleton<IAuthorizationHandler, MyCustomHandler>();
【问题讨论】:
-
服务的调用顺序无关紧要。你在 AddAuthentication() 之后添加了
AddJwtBearer()吗?您是否在请求管道中调用app.UseAuthentication();和app.UseAuthorization();?请注意这里的顺序确实很重要。 -
是的。上面的代码只是一个 sn-p——我在 AddAuthentication 之后调用的自定义方法中调用 AddJwtBearer。我实际上有几个自定义身份验证方案。我在 Configure 方法中以正确的顺序调用 app.UseAuthentication() 和 app.UseAuthorization()。
标签: c# asp.net-core authentication authorization