找不到UserName的AuthorizationPolicy

时间:2019-02-15 15:29:29

标签: c# asp.net-core-mvc asp.net-authorization

我正在尝试为需要执行需要权限的控制器的某些操作的某些用户添加基于策略的新授权。我是基于策略的授权的新手,但是我按照this帖子中的所有说明进行操作,而且看起来很简单。

在我的Startup.cs中,在 AddMvc()方法之后,我有:

services.AddAuthorization(options =>
{
    options.AddPolicy("AgentsActivityReport ", policy => policy.RequireUserName("AnaR"));
}); 

然后,在我的控制器操作中,我有:

[Authorize(Policy = "AgentsActivityReport")]
public ActionResult AgentsActivity()
{
    //some code
}

但是,当我启动应用程序时,出现以下错误:

  

InvalidOperationException:名为以下内​​容的AuthorizationPolicy:   找不到“ AgentsActivityReport”。

我还阅读了其他一些主题/帖子,例如:

Claim Based And Policy-Based Authorization With ASP.NET Core 2.1

reported issue

一切似乎都正确。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您似乎在中间件中注册了一个名为 "AgentsActivityReport " 的策略,末尾有一个空格,但在没有空格 "AgentsActivityReport" 的情况下对控制器进行了注释。

答案 1 :(得分:0)

基于this的帖子,我能够声明并允许我的用户通过使用需求来调用控制器的操作。由于我的条件必须是“允许某些角色或某个名为AnaR的用户”,因此我不得不将该逻辑放入 AuthorizationHandler.cs

Startup.cs

services.AddAuthorization(options => {
         options.AddPolicy("ReportActivityPolicy", policy =>
            {
                policy.AddRequirements(new UserNameRequirement("AnaR"));                    
            });
        });

services.AddSingleton<IAuthorizationHandler, AgentsActivityAuthorizationHandler>();

然后,在一个单独的文件中:

public class AgentsActivityAuthorizationHandler : AuthorizationHandler<UserNameRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, UserNameRequirement requirement)
    {
        if (context.User.IsInRole("Administrator") || context.User.IsInRole("Manager") || context.User.Identity.Name == requirement.UserName)
        {
            context.Succeed(requirement);
        }

        return Task.FromResult(0);
    }
}

public class UserNameRequirement : IAuthorizationRequirement
{
    public UserNameRequirement(string username)
    {
        this.UserName = username;
    }

    public string UserName { get; set; }
}

然后,在我的控制器中,执行以下操作:

[Authorize(Policy = "ReportActivityPolicy")]
public ActionResult AgentsActivity()
{
    //code of your controller.
}

希望有帮助!