过去几天我一直在学习Asp.Net身份,例如,我熟悉如何使用[Authorize(Roles = "Admin")]
或[Authorize(Policy = "OnlyAdminAndModerators")]
授权 controller 。
我正在使用JWT令牌,通过“ [[Authorize(Roles =“ Admin”)]]”进行授权时,我要做的就是在令牌上设置角色类型,如下所示:
{
"nameid": "a173e923-1808-4d7d-2b64-08d684882677",
"unique_name": "yuri",
"role": [
"Admin",
"Moderator"
],
"nbf": 1549522727,
"exp": 1549609127,
"iat": 1549522727
}
这样,我的控制器就可以通过json
上的“角色”名称和“ Admin ”的值进行身份验证。
我听说可以在Identity AspNetRole表上创建一个角色,通过AspNetRoleClaims表将一个声明与该角色相关联,例如Admin可以具有“ CanAdd”声明,然后在Startup类中,我可以创建一个类似options.AddPolicy("Add Role", policy => policy.RequireClaim("CanAdd", "AddClaim"));
最后,我可以继续使用我的控制器,并使用[Authorize(Policy = "Add Role")]
设置方法,该控制器将授权任何具有Admin角色的用户,因为他可以拥有CanAdd声明。
对不起,我知道这是一个大问题,但我真的很想完成这项工作。
预先感谢。
答案 0 :(得分:1)
获取基于令牌内容的其他声明的一种方法可以在消息处理程序中完成,该消息处理程序在读取令牌之后并在授权步骤之前运行。对于.NET Full框架,我使用OWin执行此操作。此块将其他声明插入ClaimsPrinciple中,然后可以在您定义的策略中使用。
这是我的启动文件:
ConfigureAuthorization->我的扩展方法来包装tge BearerTokenAuthentication owin块 IncludeAzureActiveDirectoryUserClaims->从Azure APi获取声明并添加它们...
using Owin;
[assembly: OwinStartup(typeof(Token.API.Startup))]
namespace Token.API
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.ConfigureAuthorization(ClaimsProviders
.InitializeAuthorizationProviders()
.IncludeAzureActiveDirectoryUserClaims()
);
}
}
}
如果我为.NET Core这样做,它将看起来像这样: 承载身份验证:link
在startup.cs中:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseAuthentication();
app.Use(async (context, next) =>
{
//Retrieve claims from database based on roles in token.
// Add to loaded identity (= context.User)
await next.Invoke();
});