ASP.NET Core mvc 视图基于授权View-based authorization in ASP.NET Core MVC

本文内容

开发人员通常需要根据当前用户标识来显示、隐藏或修改 UI。可以通过依赖关系注入访问 MVC 视图中的授权服务。若要将授权服务注入到 Razor 视图,请使用 @inject 指令:

  1. @using Microsoft.AspNetCore.Authorization
  2. @inject IAuthorizationService AuthorizationService

如果要在每个视图中设置授权服务,请将 @inject 指令放入Views目录的 _ViewImports.有关详细信息,请参阅视图中的依赖关系注入

使用注入的授权服务调用 AuthorizeAsync 的方法与在基于资源的授权期间进行检查的方式完全相同:

  1. @if ((await AuthorizationService.AuthorizeAsync(User, "PolicyName")).Succeeded)
  2. {
  3. <p>This paragraph is displayed because you fulfilled PolicyName.</p>
  4. }

在某些情况下,资源将是您的视图模型。调用 AuthorizeAsync 的方法与在基于资源的授权期间进行检查的方式完全相同:

  1. @if ((await AuthorizationService.AuthorizeAsync(User, Model, Operations.Edit)).Succeeded)
  2. {
  3. <p><a class="btn btn-default" role="button"
  4. href="@Url.Action("Edit", "Document", new { id = Model.Id })">Edit</a></p>
  5. }

在前面的代码中,该模型将作为资源进行传递,策略评估应考虑到该资源。

警告

请不要依赖于应用的 UI 元素的切换可见性,作为唯一的授权检查。隐藏 UI 元素可能无法完全阻止对其关联控制器操作的访问。例如,请考虑前面代码片段中的按钮。如果用户知道相对资源 URL 是 /Document/Edit/1的,则用户可以调用 Edit 操作方法。出于此原因,Edit 操作方法应执行其自己的授权检查。