Skip to main content

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 PagePageModel类上添加[Authorize]特性使得Page需要认证,我们还可以在添加RazorPage服务的时候,使用约定添加认证。如下图:

如上图所示,我们在Startup.ConfigureService中添加AddRazorPges的服务的时候,分别使得

/Contact 页面需要认证,使得目录/Private以及下的所有子目录和文件都需要认证,除了页面/Private/PublicPage和目录 /Private/PublicPages 

假如我们要指定一个授权规则(policy),如下图:


后面的AtLeast21就是一个授权规则。

后面的AtLeast21就是一个授权规则。


或者指定一个规则:


或者指定一个Area下的一个目录:


允许匿名访问一个页面或者一个目录:


合并使用AuthorizeAllowAnonymous:


但是需要注意:


基于角色的授权

需要注意的是必须已经通过了认证的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"));

    });

}