web-dev-qa-db-ja.com

Asp.Net CoreのRazorページでユーザー認証ポリシーのログインを確認する

私はこれの変種を探しています

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

しかし、ロールの後でチェックするのではなく、これを行うことでコントローラーで行うのと同じように、ポリシーへのチェックの後でいます。

[Authorize(Policy = Policies.RequireAdmin)]
17

これは尋ねられた質問に似ているようです 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>
}
20
James P

Dot net core 2.0では、AuthorizationService.AuthorizeAsyncはブール値を返さなくなり、AuthorizationResultを返します。ドットネットコア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>
}
17

したがって、完全なビューには以下が含まれます。

@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>
}
5
Jesus Mostajo

これを多くのビューで使用する場合は、カスタム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>
    }

はるかに簡潔に見えるでしょう。

1
Sergey

もっと簡潔に言うと:

_@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を渡すことができます。

0
Darren