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

Asp.net mvc 在Asp.Net Core上的Razor页面中检查登录用户授权策略,asp.net-mvc,razor,asp.net-core-mvc,asp.net-identity-3,Asp.net Mvc,Razor,Asp.net Core Mvc,Asp.net Identity 3,我在找一个变种 @if (SignInManager.IsSignedIn(User) && User.IsInRole(Roles.Administrator)) { <div id="editArticle"> 这似乎类似于所问的问题 我发现这个链接可能会有所帮助: 该页中的示例: @if (await AuthorizationService.AuthorizeAsync(User, "PolicyName")) { <p>This

我在找一个变种

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

这似乎类似于所问的问题

我发现这个链接可能会有所帮助:

该页中的示例:

@if (await AuthorizationService.AuthorizeAsync(User, "PolicyName"))
{
    <p>This paragraph is displayed because you fulfilled PolicyName.</p>
}
@if(等待AuthorizationService.authorizationAsync(用户,“PolicyName”))
{
显示此段落是因为您完成了策略名称

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

@if(等待AuthorizationService.authorizationasync(用户、模型、操作、编辑))
{

}
因此,完整视图包含:

@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>
}
@使用Microsoft.AspNetCore.Authorization
@注入IAuthorizationService授权服务
//您的HTML元素,即:
@if(wait AuthorizationService.authorizationAsync(用户,“RequireAuthenticatedUser”))
{
  • 角色
  • }
    更简洁地说:

    @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>
    }
    
    @inject Microsoft.AspNetCore.Authorization.IAuthorizationService authorizationService
    @if(wait authorizationService.authorizationAsync(用户,null,“RequireAuthenticatedUser”))
    {
    
  • 角色
  • }

    似乎
    authorizationAsync()
    需要资源参数,但可以像我的示例中那样传递null。

    对于Dot net core 2.0 AuthorizationService.AuthorizationAsync不再返回布尔值,它返回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>
    }
    
    @使用Microsoft.AspNetCore.Authorization
    @注入IAuthorizationService授权服务
    @if((wait AuthorizationService.authorizationAsync(用户,“RequireAuthenticatedUser”)).successed)
    {
    
  • 角色
  • }
    如果要在许多视图中使用此功能,则最好实现自定义RazorPage:

    公共抽象类MyRazorPage:RazorPage
    {
    公共异步任务HasPolicyAsync(字符串policyName)
    {
    var authorizationService=Context.RequestServices.GetService(typeof(IAuthorizationService))作为IAuthorizationService;
    bool isAdmin=(wait authorizationService.authorizationAsync(User,policyName))。成功;
    返回isAdmin;
    }
    }
    
    然后打开_ViewImports.cshtml并添加下一条指令:

    @inherits MyRazorPage<TModel>
    
    @继承MyRazorPage
    
    现在,您可以从任何视图调用HasPolicyAsync()方法:

        if (await HasPolicyAsync(Policies.RequireAdmin))
        {
            <h2>Admin is authorized</h2>
        }
    
    if(等待HasPolicyAsync(Policies.RequireAdmin))
    {
    管理员是授权的
    }
    

    它看起来更简洁。

    在大多数情况下,最好使用TagHelper来处理它。 您可以像这样使用它:

    <li policy="@MyGroups.Administrators">
    ....
    
  • ....
  • 所以不再有魔力了:-)


    请参阅:

    这太棒了D对于下一个查找此文件的用户,您需要使用Microsoft.AspNetCore.Authorization和
    @InjectIAuthorizationService AuthorizationService
    aswell@Thomas谢谢你把。。。在回答这个问题时,MS忘记了他们文档中的重要信息。@JReam hehe yea我只是希望人们能投票表决这个问题而不是评论:把所有这些anwser都钉在@Talnaci Sergiu Vlad的anwser作品上。
    @inherits MyRazorPage<TModel>
    
        if (await HasPolicyAsync(Policies.RequireAdmin))
        {
            <h2>Admin is authorized</h2>
        }
    
    <li policy="@MyGroups.Administrators">
    ....