私はこれの変種を探しています
@if (SignInManager.IsSignedIn(User) && User.IsInRole(Roles.Administrator))
{
<div id="editArticle">
しかし、ロールの後でチェックするのではなく、これを行うことでコントローラーで行うのと同じように、ポリシーへのチェックの後でいます。
[Authorize(Policy = Policies.RequireAdmin)]
これは尋ねられた質問に似ているようです 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>
}
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>
}
したがって、完全なビューには以下が含まれます。
@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>
}
これを多くのビューで使用する場合は、カスタム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>
}
はるかに簡潔に見えるでしょう。
もっと簡潔に言うと:
_@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を渡すことができます。