【发布时间】:2017-03-04 08:20:39
【问题描述】:
我是 .Net / ASP.NET 开发的新手,我正在尝试使用我想在全局级别添加的自定义策略,这样我就不必在每个控制器中添加 [Authorize] 属性对于我制定的政策。
我创建了一个名为 SuperAdminUsers 的策略并使用来自 UserNamesRequirement 的自定义要求,我想将其设置在全局级别,这样所有 SuperAdminUsers 都可以访问所有控制器和操作。
以下是我在startup.cs 文件中创建的策略。
services.AddAuthorization(
option =>
{
option.AddPolicy("Admin", policy => policy.RequireRole("DOMAIN\\GroupName"));
option.AddPolicy("SuperAdminUsers", policy => policy.Requirements.Add(new UserNamesRequirement("DOMAIN\\USER1", "DOMAIN\\USER2"))
}
);
// Add Custom filters
services.AddMvc(
config =>
{
var policy = new AuthorizationPolicyBuilder();
policy.Requirements.Add(new UserNamesRequirement("DOMAIN\\USER1"));
policy.Build();
config.Filters.Add(new AuthorizeFilter(policy));
}
);
在上面的config.Filters 中,我收到如下截图所示的错误:
这是我的客户需求和处理类:
public class UserNamesRequirement : IAuthorizationRequirement
{
public UserNamesRequirement(params string[] UserNames)
{
Users = UserNames;
}
public string[] Users { get; set; }
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, UserNamesRequirement requirement)
{
// var userName = context.User.FindFirst(ClaimTypes.NameIdentifier).Value;
var userName = context.User.Identity.Name;
if (requirement.Users.ToList().Contains(userName))
context.Succeed(requirement);
return Task.FromResult(0);
}
更新 1:
使用以下代码更新启动文件,但仍然无法授权。
services.AddMvc
(
config =>
{
var policyBuilder = new AuthorizationPolicyBuilder();
policyBuilder.Requirements.Add(new UserNamesRequirement("DOMAIN\\USER1", "DOMAIN\\USER2"));
var policy = policyBuilder.Build();
config.Filters.Add(new AuthorizeFilter(policy));
}
);
我正在尝试访问的控制器:
[Authorize(Policy = "Admins")]
[Authorize(Policy = "SuperAdminUsers")]
public class OperatingSystemsController : Controller
{
private readonly ServerMatrixDbContext _context;
public OperatingSystemsController(ServerMatrixDbContext context)
{
_context = context;
}
// GET: OperatingSystems
public async Task<IActionResult> Index()
{
return View(await _context.OperatingSystems.ToListAsync());
}
}
这是我在 str 输出日志文件中看到的内容:
注意:我删除了真实域和用户名。
Application started. Press Ctrl+C to shut down.
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 GET http://localhost/demo/OperatingSystems/Create
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[1]
Authorization was successful for user: DOMAIN\USER1.
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
Authorization failed for user: DOMAIN\USER1.
warn: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
info: Microsoft.AspNetCore.Mvc.ChallengeResult[1]
非常感谢任何帮助。
【问题讨论】:
-
为所有控制器创建一个基类,并仅为该类设置 [Authorize]。
-
所以,我创建了一个基类并添加了 Authorize,然后我将它引入到所有控制器中,就像这样
Public class SearchController : Controller, BaseAuth { }? -
我的意思是这个 BaseController : Controller, YourController: BaseController
标签: c# asp.net-core asp.net-core-mvc