首页 > 代码库 > ASP.NET Core--基于资源授权

ASP.NET Core--基于资源授权

常授权取决于被访问的资源。例如一个文档可以具有作者属性。仅文档作者将被允许更新它,所以资源必须从文档库被加载可以由授权评估之前。这不能与一个授权属性来完成,因为属性的评估需要的数据绑定前,在你自己的代码的地方加载一个动作内的资源运行。相反的声明授权,属性的方法,我们必须使用必要的授权,其中一个开发者称他自己的代码中的授权功能。

在代码中授权

授权是作为一种服务,IAuthorizationService通过该服务集合中注册,并提供依赖注入的控制器访问。

公共 DocumentController  控制器{     IAuthorizationService  _authorizationService ;    公共 DocumentController IAuthorizationService  authorizationService {         _authorizationService  =  authorizationService ;     } }

IAuthorizationService 有两种方法,一是在那里你,你通过资源和需求评估名单通过资源和政策名称和其他。

任务< 布尔>  AuthorizeAsync ClaimsPrincipal  用户对象 资源IEnumerable的< IAuthorizationRequirement >  的要求); 任务< 布尔>  AuthorizeAsync ClaimsPrincipal  用户对象 资源policyName );

要调用该服务的操作中加载的资源,然后调用AuthorizeAsync您需要的过载。例如

公共 异步 任务< IActionResult >  编辑的Guid  documentId {     文档 的文档 =  的DocumentRepository 查找documentId );    如果 文件 ==  {         返回 HttpNotFoundResult ();     }    如果 等待 authorizationService AuthorizeAsync 用户文件“EditPolicy的” ))    {         返回 查看文档);     }     其他    {         返回 ChallengeResult ();     } }

编写一个资源处理程序

写作基于资源授权的处理程序是不是太大的不同来写一个简单的要求处理您创建一个需求,然后实现对需求的处理程序,指定要求的资源类型之前也。例如,这可能会接受一个文档资源将如下所示的处理程序;

公共 DocumentAuthorizationHandler  AuthorizationHandler < MyRequirement 文档> {     公众 覆盖 任务 HandleRequirementAsync AuthorizationHandlerContext  背景下MyRequirement  要求文档 资源{         //验证对资源和身份的要求。        返回 任务CompletedTask ;     } }

不要忘了,你还需要注册在你的处理ConfigureServices方法;

服务AddSingleton < IAuthorizationHandler DocumentAuthorizationHandler >();

操作要求

如果您正在基于例如读取操作的决定,写,更新和删除,您可以使用OperationAuthorizationRequirement类的Microsoft.AspNetCore.Authorization.Infrastructure命名空间。此预建要求类,您可以编写具有参数化的操作名称,一个单一的处理程序,而不是为每个操作创建单独的类。要使用它提供了一些操作的名称:

公共 静态 操作{     公共 静态 OperationAuthorizationRequirement  创建 =         OperationAuthorizationRequirement  {  名称 =  “创建”  };     公共 静态 OperationAuthorizationRequirement  =         OperationAuthorizationRequirement    {  名称 =  “读取”  };     公共 静态 OperationAuthorizationRequirement  更新 =         OperationAuthorizationRequirement  {  名称 =  “更新”  };     公共 静态 OperationAuthorizationRequirement  删除 =         OperationAuthorizationRequirement  {  名称 =  “删除”  }; }

然后,您的处理程序,可以实现如下,用一个假设的Document类为资源;

公共 DocumentAuthorizationHandler  AuthorizationHandler < OperationAuthorizationRequirement 文档> {     公众 覆盖 任务 HandleRequirementAsync AuthorizationHandlerContext  背景下OperationAuthorizationRequirement  要求文档 资源{         //使用资源,身份和验证操作        从需求// Name属性值。        返回 任务CompletedTask ;     } }

你可以看到处理器上工作OperationAuthorizationRequirement处理程序中的代码使得其评估时必须考虑的要求提供Name属性考虑在内。

打电话给你打电话时需要指定动作的工作资源处理程序AuthorizeAsync在你的行动。例如

如果 的await  authorizationService AuthorizeAsync 用户文件业务)){     返回 查看文档); } 其他{     返回 ChallengeResult (); }

这个例子检查用户是否能够为当前执行读操作document实例。如果授权成功将返回文档的视图。如果授权失败返回ChallengeResult将通知任何身份验证的中间件授权失败和中间件可以采取适当的响应,例如返回一个401或403状态码,或将用户重定向到登录页面进行交互式浏览器客户端。

ASP.NET Core--基于资源授权