web-dev-qa-db-ja.com

.NET Core 1.0 MVCのビューで承認ポリシーを使用する方法はありますか?

コントローラでは、問題なく[Authorize("policyName")]を記述できますが、ビューでポリシーを使用する方法はありますか? HTMLを認証するたびにUser.IsInRole(...)を使用したくありません。

編集:

ここにいくつかのコードがあります

Startup.cs-ポリシー宣言

    services.AddAuthorization(options =>
    {
        options.AddPolicy("testPolicy", policy =>
        {
            policy.RequireAuthenticatedUser()
                  .RequireRole("RoleOne", "RoleTwo", "RoleThree")
                  .RequireClaim(ClaimTypes.Email);
        });
    });

管理者コントローラー

[Authorize("testPolicy")]
public class AdminController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

ナビゲーションバーHTML

<div class="navbar navbar-inverse navbar-fixed-top">
            <div class="container">
                <div class="navbar-collapse collapse">
                    <ul class="nav navbar-nav">
                        <li><a asp-controller="Home" asp-action="Index">Home</a></li> 

                        <!-- I want to implement my policy here. -->
                        @if (User.IsInRole("..."))
                        {
                            <li><a asp-controller="Admin" asp-action="Index">Admin</a></li>
                        }
                    </ul>
                    @await Html.PartialAsync("_LoginPartial")
                </div>
            </div>
18
Daath

私は役に立つかもしれないこのリンクを見つけました: 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>
}
19
Martin Dawson

関連付けられている要素を条件付きで非表示にするタグヘルパーを作成することになりました。

[HtmlTargetElement(Attributes = "policy")]
public class PolicyTagHelper : TagHelper
{
    private readonly IAuthorizationService _authService;
    private readonly ClaimsPrincipal _principal;

    public PolicyTagHelper(IAuthorizationService authService, IHttpContextAccessor httpContextAccessor)
    {
        _authService = authService;
        _principal = httpContextAccessor.HttpContext.User;
    }

    public string Policy { get; set; }

    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        // if (!await _authService.AuthorizeAsync(_principal, Policy)) ASP.NET Core 1.x
        if (!(await _authService.AuthorizeAsync(_principal, Policy)).Succeeded)
            output.SuppressOutput();
    }
}

使用法

<li policy="testPolicy"><a asp-controller="Admin" asp-action="Index">Admin</a></li>
19
Chris

これは、スタートアップファイルのすべてのページにIDを挿入できる場合の、ASP Coreの大きな改善点の1つです。

@if (User.IsInRole("Admin"))
{
    <p>
    <a asp-action="Create" asp-controller="MyController">Create New</a>
</p>
}

Startup.csの場合:

 services.AddIdentity<ApplicationUser, IdentityRole>()

編集:Ok私は投稿を読み間違えました、あなたはすでにこれを知っていました:)-誰かがそれを使うことができればとにかくそれを残します。

0
Morten_564834