在Asp.Net Core的Razor页面中检查登录用户AuthorizePolicy

时间:2016-05-29 11:31:48

标签: asp.net-mvc razor asp.net-core-mvc asp.net-identity-3

我正在寻找此

的变体
@if (SignInManager.IsSignedIn(User) && User.IsInRole(Roles.Administrator))
{
    <div id="editArticle">

但不是在角色之后检查,而是在检查策略之后,就像在控制器中执行此操作一样。

[Authorize(Policy = Policies.RequireAdmin)]

6 个答案:

答案 0 :(得分:15)

这与问题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>
}

答案 1 :(得分:8)

使用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>
}

答案 2 :(得分:4)

因此,完整视图包含:

@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>
}

答案 3 :(得分:1)

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

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

所以不再是 Magicstrings :-)

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

答案 4 :(得分:0)

更简洁地说:

@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()需要资源参数,但是可以像我的例子一样传递null。

答案 5 :(得分:0)

如果您要在许多视图中使用它,那么您最好实现自定义 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>
    }

看起来会更简洁。

相关问题