我按照提供的文档实现了一个自定义的IAuthorizationPolicyProvider。此处但当我调试并到达处理程序并查看context.User对象时,我看到IsAuthenticated或context.User.IsInRole等属性是falseempty。我的应用程序配置了jwt token授权,我已经确认token确实包含角色payload数据中的值,但它似乎没有在到达处理程序之前进行认证,让我使用这些值。谁能帮助我理解操作的顺序,或者说我如何才能完成实际发生的认证?
在我的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>();
经过一番修整,我想分享一下我所学到的知识,以回答这个问题以及实现自定义策略提供者如何工作的更广泛的问题。当在Startup.cs中使用AddAuthentication和AddAuthorization时,这将作为你设置默认授权策略提供者时使用的策略设置,例如像这样。
public YourAuthorizationPolicyProvider(IOptions<AuthorizationOptions> options)
{
this.BackupPolicyProvider = new DefaultAuthorizationPolicyProvider(options);
}
对我来说,我使用这个后备策略提供者作为默认值。
public Task<AuthorizationPolicy> GetDefaultPolicyAsync()
{
return this.BackupPolicyProvider.GetDefaultPolicyAsync(); //this is the default policy established in Startup.cs
}
(注:我发现一些令人困惑的东西,而且没有很多清晰的文档。) DefaultPolicy与FallbackPolicy,尤其是在写这篇文章的时候,GetFallbackPolicyAsync最近似乎成了实现IAuthorizationPolicyProvider时需要实现的方法。DefaultPolicy:当应用[Authorize]属性时,这就是要使用的策略。当 没有 策略,然后调用GetFallbackPolicyAsync)。
当我构建自定义策略时,我缺少的是在AuthorizationPolicyBuilder中指定我希望策略使用的认证方案。我现在意识到它在文档中,但它没有被特别调用,所以我错过了它。
public Task<AuthorizationPolicy> GetPolicyAsync(string policyName)
{
if (//some check on your policy name)
{
var policy = new AuthorizationPolicyBuilder(//what scheme to use for authentication);
// your requirements
return Task.FromResult(policy.Build());
}
}