c# - ASP.NET Core 2 - AD 组未映射到安全角色
问题描述
我一直在通过 User.Identity.Name 检索用户名,但是我需要一种方法来限制通过 Active Directory 中的组访问某些页面。
例如,“域管理员”可以查看所有页面,“查看用户”只能查看登录页面和其他页面。
在 Startup.cs
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddAuthorization(options =>
{
options.AddPolicy("AdminRoleOnly", policy => policy.RequireRole(Configuration["SecuritySettings:AdminGroup"]));
});
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});
配置:
"SecuritySettings": {
"AdminGroup": "MYDOMAIN\\Domain Admins"
}
在我的页面模型上(我没有控制器):
[Authorize(Policy = "AdminRoleOnly")]
public class RequestsModel : PageModel
我只是收到一条错误消息,说无论如何我都没有被授权
解决方案
最后我自己写了一个处理程序(在另一篇文章的帮助下):
public class CheckADGroupHandler : AuthorizationHandler<CheckADGroupRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
CheckADGroupRequirement requirement)
{
var groups = new List<string>();
var wi = (WindowsIdentity)context.User.Identity;
if (wi.Groups != null)
{
foreach (var group in wi.Groups)
{
try
{
groups.Add(group.Translate(typeof(NTAccount)).ToString());
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
foreach (string policygroup in requirement.GroupName)
{
if (groups.Contains(policygroup))
{
context.Succeed(requirement);
}
}
}
return Task.CompletedTask;
}
}
推荐阅读
- python - 如何按顺序生成数组中元素的所有组合?
- python - 在python 2.7中继承aiml
- c# - UWP:在按钮单击事件上取消选中 ListView 内的复选框
- php - 如何在多次提交期间保留值?
- java - 带有 Java 9 的 Groovy 控制台抛出 JAXBException
- css - 如何根据 gclid 参数隐藏标题?
- jquery - 如何将表单数据直接发送到控制器而不是一一检索
- android - 如何使用 gson 在 Kotlin 的 Json 数组中插入 Json 对象
- javascript - 如何使用按钮创建 div 元素
- java - 为什么 myProcess.getInputStream() 可以使用 java.exe 而不是 javaw.exe?