【问题标题】:Check if user belongs to an AD group .net core检查用户是否属于 AD 组 .net 核心
【发布时间】:2017-12-27 03:57:10
【问题描述】:

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

我不确定我们如何实现这个 .NET 核心,因为没有任何示例可以这样做。

【问题讨论】:

  • 尝试像[Authorize(Role="ADGroupName")]这样使用授权属性,确保启用了Windows身份验证。如果可行,我很确定您可以使用 User.IsInRole("ADGroupName"),您必须从那里查看和工作。

标签: c# asp.net-core active-directory asp.net-core-mvc asp.net-core-2.0


【解决方案1】:

我遇到了类似的问题,通过中间件解决了。

  1. 我在 appsettings.json 中添加了用户和组以进行身份​​验证(或哪些将被授权),例如:

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

    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();
        }
    }
    
  3. 为此中间件添加扩展类

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

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

【讨论】:

  • 我不知道为什么这没有被标记为已回答,但它帮助我解决了发布的确切问题。
  • 一个很好的解决方案 - 简单易懂、合乎逻辑并且正是我所需要的。谢谢:-)
【解决方案2】:

我尝试了与上述代码类似的东西,但我遇到了一些问题,然后意识到我可以将此代码添加到 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 Access Denied Page 可以自定义,因此如果用户在组中,则加载页面,如果不是定向到 403 错误页面。

鉴于我发现的所有解决方案都有更多代码,我想知道这种方法是否有缺点。当然,这不会是跨平台的,但我在想,如果代码正在检查 Active Directory 组成员身份,它们可能会在 IIS 上运行。

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 2014-04-08
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多