ASP.NET Core MVC 中基于视图的授权

开发人员通常希望根据当前用户标识显示、隐藏或以其他方式修改 UI。 可以通过依赖项注入在 MVC 视图中访问授权服务。 若要将授权服务注入 Razor 视图,请使用 @inject 指令:

@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService AuthorizationService

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

使用注入的授权服务调用 AuthorizeAsync,其方式与在基于资源的授权过程中检查的方式完全相同:

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

有时资源是视图模型。 调用 AuthorizeAsync 的方式与在基于资源的授权过程中检查的方式完全相同:

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

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

警告

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