在 Asp.Net Core 的 Razor 页面中检查登录用户授权策略

Posted

技术标签:

【中文标题】在 Asp.Net Core 的 Razor 页面中检查登录用户授权策略【英文标题】:Checking login user AuthorizePolicy in Razor page on Asp.Net Core 【发布时间】:2016-05-29 11:31:47 【问题描述】:

我正在寻找这个的变种

@if (SignInManager.IsSignedIn(User) && User.IsInRole(Roles.Administrator))

    <div id="editArticle">

但我不是在角色之后检查,而是在检查策略之后,就像您在控制器中那样通过这样做。

[Authorize(Policy = Policies.RequireAdmin)]

【问题讨论】:

【参考方案1】:

这似乎类似于here提出的问题

我发现此链接可能会有所帮助:https://docs.asp.net/en/latest/security/authorization/views.html

该页面的示例:

@if (await AuthorizationService.AuthorizeAsync(User, "PolicyName"))

    <p>This paragraph is displayed because you fulfilled PolicyName.</p>

在某些情况下,资源将是您的视图模型,您可以调用 AuthorizeAsync 的方式与您在 基于资源的授权;

@if (await AuthorizationService.AuthorizeAsync(User, Model, Operations.Edit))

    <p><a class="btn btn-default" role="button"
    href="@Url.Action("Edit", "Document", new id= Model.Id)">Edit</a></p>

【讨论】:

这太棒了。 :D 对于下一个寻找这个你需要@using Microsoft.AspNetCore.Authorization@inject IAuthorizationService AuthorizationService 以及 @Thomas 感谢您将 using... 子句放入此答案,MS 忘记了他们文档中的重要信息。 @JReam 呵呵,是的,我只是希望人们会赞成这个问题而不是评论:P 在所有这些回答者中,只有@Talnaci Sergiu Vlad 的回答者有效。【参考方案2】:

使用 Dot net core 2.0 AuthorizationService.AuthorizeAsync 不再返回布尔值,而是返回 AuthorizationResult。 dot net core 2.0 的工作版本是这样的:

@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService AuthorizationService

@if ((await AuthorizationService.AuthorizeAsync(User, "RequireAuthenticatedUser")).Succeeded)

     <li><a asp-area="" asp-controller="Roles" asp-action="Index">Roles</a></li>

【讨论】:

【参考方案3】:

因此完整的视图包含:

@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService AuthorizationService

// Your HTML elements and i.e.:
@if (await AuthorizationService.AuthorizeAsync(User, "RequireAuthenticatedUser"))

     <li><a asp-area="" asp-controller="Roles" asp-action="Index">Roles</a></li>

【讨论】:

【参考方案4】:

更简洁地说:

@inject Microsoft.AspNetCore.Authorization.IAuthorizationService authorizationService

@if (await authorizationService.AuthorizeAsync(User, null, "RequireAuthenticatedUser"))

     <li><a asp-area="" asp-controller="Roles" asp-action="Index">Roles</a></li>

看来AuthorizeAsync()需要resource参数,但可以像我的例子一样传递null。

【讨论】:

【参考方案5】:

如果您要在多个视图中使用它,那么您最好实现一个自定义 RazorPage

public abstract class MyRazorPage<T> : RazorPage<T>

    public async Task<bool> HasPolicyAsync(string policyName)
    
        var authorizationService = Context.RequestServices.GetService(typeof(IAuthorizationService)) as IAuthorizationService;
        bool isAdmin = (await authorizationService.AuthorizeAsync(User, policyName)).Succeeded;
        return isAdmin;
    

然后打开_ViewImports.cshtml并添加下一条指令:

@inherits MyRazorPage<TModel>

现在您可以从任何视图调用 HasPolicyAsync() 方法:

    if (await HasPolicyAsync(Policies.RequireAdmin))
    
        <h2>Admin is authorized</h2>
    

它看起来会更简洁。

【讨论】:

【参考方案6】:

现在在大多数情况下最好使用 TagHelpers 处理。 你可以像这样使用它:

<li policy="@MyGroups.Administrators">
....

所以不再是 Magicstrings :-)

见:https://www.davepaquette.com/archive/2017/11/05/authorize-tag-helper.aspx

【讨论】:

以上是关于在 Asp.Net Core 的 Razor 页面中检查登录用户授权策略的主要内容,如果未能解决你的问题,请参考以下文章

ASP .NET Core Razor 页面中的授权

Asp.Net Core Razor 页面中的远程验证

Asp.net core razor pages 加载部分页面

如何在 ASP.Net Core Razor 页面上重定向

ASP.NET Core Razor 页面与完整 MVC Core [关闭]

在 ASP.Net Core Razor 页面中添加 Toast