简单授权只是在控制器上加上[Authorize]
[Authorize]
public class AccountController : Controller
{
public ActionResult Login()
{
}
public ActionResult Logout()
{
}
}
这表示只有经过身份验证的用户才可以访问,当然身份验证的部分,暂时不讨论,有兴趣可以去看官方文档:身份验证
你还可以使用 AllowAnonymous 属性来允许未经身份验证的用户访问单个操作。 例如:
[Authorize]
public class AccountController : Controller
{
[AllowAnonymous]
public ActionResult Login()
{
}
public ActionResult Logout()
{
}
}
我们使用标识框架创建时,会自动生成很多表,其中就有角色表,一个用户可以有多个角色,我们可以通过配置角色来进行授权,就是用户有这个角色Admin
,这个接口就能访问的到,如果没有,那就不能,会报错403
services.AddIdentityCore<User>(options =>
{
// 对密码复杂度苛刻设置
options.Password.RequireDigit = false;
options.Password.RequireLowercase = false;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
options.Password.RequiredLength = 6;
options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider;
options.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider;
}).AddRoles<Role>();
中间的内容是身份验证的密码配置,主要是AddRoles
,这里的Role
是角色类,他继承的是IdentityRole
类,这个类是自动生成,
在需要授权的位置添加[Authorize(Roles = "Admin")]
即可,注意!这里的演示是博主的角色名字,具体的名字需要自己判断,不过,一般自动生成的都是这样
使用标识框架自动生成的表中,你可以看到以下几种表:
其中带有Claims
的表分别是用户所拥有的声明和角色所拥有的声明,他的表结构是这样的:
声明Claims
可以简单理解为一个名称值对,只是表示用户可以是什么,或者这个角色是什么,我来举个例子:
身份证大家都有吧,那里面的姓名:张三,性别:男等都是名称值对,对吧,它们只是表示你是张三,你的性别是男
当然,这只是比较浅显的说法,具体我是看这个博主的文章了解的:添加链接描述
好,现在来进行配置
//配置基于策略和声明的授权
builder.Services.AddAuthorization(options =>
{
//声明授权
options.AddPolicy("MusicPower", policy => policy.RequireClaim("music"));
});
该策略名称为MusicPower
,要求用户具有声明music
,具体music
对应的值是多少,不关心,只要有这个声明就行
当然,我们也可以将music
的值限定一下:
options.AddPolicy("MusicPower", policy => policy.RequireClaim("music", "m1"));
在需要授权的位置添加[Authorize(Policy = "MusicPower")]
即可
// 仅要求用户具有声明“Rank”,不关心值是多少
[Authorize(Policy = "MusicPower")]
public string GetForMusicPower()
{
return "";
}
// 要求用户具有声明“Rank”,且值为“M3”
[HttpGet("/Music")]
[Authorize(Policy = "MusicPower")]
public string GetForMusicPower2()
{
return "";
}
另外,有时候声明策略略微有些复杂,可以使用RequireAssertion来实现:
options.AddPolicy("MusicPower", policy => policy.RequireAssertion(context =>
context.User.HasClaim(c => (c.Type == "music" || c.Type == "Name") && c.Issuer == "Issuer")));
待续…