Asp.net Core中的授权介绍
分类: Asp.net Core认证和授权 ◆ 标签: #Asp.Net core基础 #授权 #.Net ◆ 发布于: 2023-05-27 20:02:40

我们今天来讨论ASP.netCore中的授权。
我们前面讨论了认证,我们需要注意的是认证之后会怎么样?认证之后系统会生成一个Identity, 通过各种其他的方式给到客户或者客户应用程序,也就是一个ClaimPrinpcal, 每个ClaimPrincpal 包含多个ClaimIdentity, 每个ClaimIdentity包含多个Claim, 在基于Web应用中最终对应的数据会是HttpContext.User 用于表示认证成功之后的ClaimPrinpcal. 但是在认证这一侧,对应的是AuthorizationHandlerContext的User属性,也就是AuthorationHandlerContext.User, 需要注意的是HttpContext的User属性和AuthorationHandlerContext的User属性都是ClaimPrinpcal的类型,最终也是在不同场景下赋将ClaimPrinpcal赋值到这些属性下。
另外对于ASP.net Core提供的一个简单的解决方案,主要是通过如下的要素来完成授权过程:
AuthorationService
AuthorationHandler
OperationRequirement 代表用户需要的授权要求。
认证还是通过Claim来完成认证的。基于角色或者基于Cliam的policy
通过特性[Authorize]和[AllowAnonymous]在MVC Controller或者method上定义是否需要授权。
如何开启所有的请求都需要认证?
很简单只需要在添加AuthorationService中设置fallbackPolicy就可以了,代码如下:
如果绿色的代码处所示,在通过扩展方法AddAuthorization() 添加授权服务的时候,通过AuthorationOption的FallbackPolicy添加一个RequireAuthenticatedUser() 指明所有的请求都需要用户已经通过认证,这种情况下除非用户的controller或者Razor Page指定了特性[AllowAnonymous]否则都需要认证用户才可以访问。
如何让MVC应用的controller或者Razor Page需要认证?
添加属性[Authorize]或者像上一小节一样添加fallbackPolicy。
如下图:
RazorPage应用的授权约定
我们除了可以在Razor Page的PageModel类上添加[Authorize]特性使得Page需要认证,我们还可以在添加RazorPage服务的时候,使用约定添加认证。如下图:
如上图所示,我们在Startup.ConfigureService中添加AddRazorPges的服务的时候,分别使得
/Contact 页面需要认证,使得目录/Private以及下的所有子目录和文件都需要认证,除了页面/Private/PublicPage和目录 /Private/PublicPages 。
假如我们要指定一个授权规则(policy),如下图:
后面的AtLeast21就是一个授权规则。
后面的AtLeast21就是一个授权规则。
或者指定一个规则:
或者指定一个Area下的一个目录:
允许匿名访问一个页面或者一个目录:
合并使用Authorize和AllowAnonymous:
但是需要注意:
基于角色的授权
需要注意的是必须已经通过了认证的ClaimPrinpcal
需要用户是Administrator角色
可以在这里指定多个角色,用逗号分隔的话,表明是其中一个角色就可以了。
假如你需要用户同时是多个角色,而不是只是其中角色就可以的话,使用如下的语句
也可以这样:
使用新式Policy语法进行基于角色模式授权。
我们这里需要先理清一个问题,就是我们先要定义Policy, 然后在Controller或者Method上应用。
先定义一个Policy 在Startup.ConfigureService方法里:
在AuthorationOption里添加一个Policy, 以RequireAdministratorRole命名。然后在后面用lambda定义一个规则。
另外如果需要有多个Role可选,可以使用如下的语法:
options.AddPolicy("ElevatedRights",policy =>
policy.RequireRole("Administrator", "PowerUser","BackupAdministrator"));
另外需要注意的是,如果是要基于角色来授权,一定要在Identity中启用角色服务。
使用Claim进行授权
我们这里先要明确清楚的一个就是Claim还是使用新式的Policy的方式进行,例如下图:
public voidConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
services.AddAuthorization(options =>
{
options.AddPolicy("EmployeeOnly", policy =>policy.RequireClaim("EmployeeNumber"));
});
}