C# 找不到按用户名列出的AuthorizationPolicy
我正在尝试为需要执行控制器某些操作(需要权限)的特定用户添加新的基于策略的授权。我是基于策略的授权新手,但我遵循了帖子上的所有说明,看起来很简单 在我的Startup.cs和AddMvc方法之后,我有:C# 找不到按用户名列出的AuthorizationPolicy,c#,asp.net-core-mvc,asp.net-authorization,C#,Asp.net Core Mvc,Asp.net Authorization,我正在尝试为需要执行控制器某些操作(需要权限)的特定用户添加新的基于策略的授权。我是基于策略的授权新手,但我遵循了帖子上的所有说明,看起来很简单 在我的Startup.cs和AddMvc方法之后,我有: services.AddAuthorization(options => { options.AddPolicy("AgentsActivityReport ", policy => policy.RequireUserName("AnaR")); }); 然后,在控制器
services.AddAuthorization(options =>
{
options.AddPolicy("AgentsActivityReport ", policy => policy.RequireUserName("AnaR"));
});
然后,在控制器操作中,我有:
[Authorize(Policy = "AgentsActivityReport")]
public ActionResult AgentsActivity()
{
//some code
}
但是,启动应用程序时,我收到以下错误:
InvalidOperationException:名为的授权策略:
找不到“AgentsActivityReport”
我还阅读了其他一些帖子,如:
一切似乎都很正确。任何想法?基于post,我能够声明并允许我的用户通过使用需求调用控制器的操作。由于我的条件必须是允许某些角色或某个名为AnaR的用户,因此我必须将该逻辑放入AuthorizationHandler.cs
Startup.cs
services.AddAuthorization(options => {
options.AddPolicy("ReportActivityPolicy", policy =>
{
policy.AddRequirements(new UserNameRequirement("AnaR"));
});
});
services.AddSingleton<IAuthorizationHandler, AgentsActivityAuthorizationHandler>();
希望有帮助 您似乎在中间件中注册了一个名为AgentsActivityReport的策略,该策略的末尾有一个空格,但在没有空格AgentsActivityReport的情况下对控制器进行了注释。配置中可能有错误,但如果没有看到,则很难判断。可能是授权被以后的注册所取代。您是否添加了两次“AddAuthorization”或其他授权功能?你能展示一下整个启动过程吗?嗨,鲁阿尔,我已经解决了这个问题,我宣布了一点不同的政策。我会在一段时间后发布我的答案。不过我很感激你的回答。谢谢
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.
}