检查用户是否属于一个AD组.NET Core

10

我有一个应用程序,在登录时,我想检查用户是否属于特定的AD组。如果是,则继续应用程序,否则显示错误:“我有AD的LDAP连接地址”。

我不确定如何在.NET Core中实现这一点,因为没有任何示例来操作。


尝试使用授权属性,像这样 [Authorize(Role="ADGroupName")],确保启用了Windows身份验证。如果可以工作,我相信你可以使用 User.IsInRole("ADGroupName"),你需要查看并从那里开始工作。 - Anton Toshik
2个回答

17

我曾遇到类似问题,通过使用中间件解决了它。

  1. 我在 appsettings.json 文件中添加了一行用于身份验证的用户和组(或者哪些将被授权),例如:

{
    "AuthenticationGroupsAndUsers": "domain\\group,domain\\username",
    "Logging": {
        "LogLevel": {
            "Default": "Warning"
        }
    }
}
  • 添加一个新类,它将读取配置并检查当前用户是否属于授权的组/用户

  • public class AdAuthorizationMiddleware
    {
    
        private readonly string _groupsAndUsersConfigField = "AuthenticationGroupsAndUsers";
        private readonly List<string> _authorizedGroupAndUsers;
        private IConfigurationRoot _configuration { get; }
    
        private readonly RequestDelegate _next;
    
        public AdAuthorizationMiddleware(RequestDelegate next)
        {
            // Read and save app settings
            _configuration = GetConfiguration();
            _authorizedGroupAndUsers = _configuration[_groupsAndUsersConfigField].Split(',').ToList();
    
            _next = next;
        }
    
        public async Task Invoke(HttpContext context)
        {
            // Check does user belong to an authorized group or not
            var isAuthorized = _authorizedGroupAndUsers.Any(i => context.User.IsInRole(i));
            // Return error if the current user is not authorized
            if (!isAuthorized){
                context.Response.StatusCode = 403;
                return;
            }
            // Jump to the next middleware if the user is authorized
            await _next.Invoke(context);
        }
    
        private static IConfigurationRoot GetConfiguration()
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json");
    
            Console.WriteLine("Configuration is loaded");
            return builder.Build();
        }
    }
    
  • 添加一个针对此中间件的扩展类

  • public static class AdAuthorizationMiddlewareExtension
    {
        public static IApplicationBuilder UseAdAuthorizationMiddleware(
            this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<AdAuthorizationMiddleware>();
        }
    }
    
  • 在Startup.cs的Configure方法中调用扩展类的这个静态方法:

  • public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        // ...
        //some code 
    
        app.UseAuthentication();
        app.UseAdAuthorizationMiddleware();
    
        // some routing 
        // ...
    }
    

    1
    我不知道为什么这个问题没有被标记为已解决,但这正是帮助我解决了所发布的确切问题的方法。 - Vrankela
    1
    一个很棒的解决方案 - 简单易懂,逻辑清晰,正是我所需要的。谢谢 :-) - SteveB

    3

    我尝试了类似于上面代码的东西,但遇到了一些问题,后来意识到我可以将这段代码添加到Startup.cs中的ConfigureServices里:

    //Required for checking Active Directory Group Membership
    services.AddAuthentication(IISDefaults.AuthenticationScheme);
    

    然后在Razor页面的代码后台,我想要限制访问,那么我可以在类定义上方添加以下这行代码:

    [Authorize(Roles = "NAME OF ACTIVE DIRECTORY GROUP")]
    

    在这里,NAME OF ACTIVE DIRECTORY GROUP 是你要检查成员资格的组的名称 - 例如 Domain Admins

    这是我需要的全部代码,以便使其工作,并使用 IIS 中的设置来进行 403 访问拒绝页面的自定义。如果用户属于该组,则加载页面,否则将他们重定向到 403 错误页面。

    我在想,这种方法是否存在缺点,因为我找到的所有解决方案都有更多的代码。当然,这不会跨平台,但我想,如果代码正在检查 Active Directory 组成员身份,则它可能正在运行在 IIS 上。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接