.NET Core 6 Windows 基于身份验证和 Active Directory 组的权限

.NET Core 6 Windows auth and Active Directory group based permissions

正在学习dotnet core 6,正在申请Intra。我需要从公司的 Active Directory (WinServer) 获取用户数据(用户名和姓氏,以及用户组)。我还需要允许访问基于 AD 用户组的页面。

我试过 Google 它,但从未成功找到 material,如何实现它。

任何人都可以给我指明方向或展示实施示例吗?现在我已经安装了 Identity 包,但我需要我的应用程序与 Windows Auth 和 Active Directory 组一起使用以获得权限。

我不确定这对活动目录是否有帮助,

https://docs.microsoft.com/en-us/dotnet/api/system.directoryservices?view=dotnet-plat-ext-6.0&viewFallbackFrom=net-5.0

这导致针对 AD 对用户进行身份验证,并且提供了组方法。

https://docs.microsoft.com/en-us/dotnet/api/system.directoryservices.accountmanagement?view=dotnet-plat-ext-6.0

对于 Win 身份验证,我可以使用

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?view=aspnetcore-6.0&viewFallbackFrom=aspnetcore-2.2&tabs=visual-studio

希望对您有所帮助!

用于连接到 AD

   using(  PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN")){}

将您的群组放入“您的域”

要从 AD 获取信息,请使用此代码

using (var context = new PrincipalContext(ContextType.Domain, "yourdomain.com"))
{
    using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
    {
        foreach (var result in searcher.FindAll())
        {
            DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
            Console.WriteLine("First Name: " + de.Properties["givenName"].Value);
            Console.WriteLine("Last Name : " + de.Properties["sn"].Value);
            Console.WriteLine("SAM account name   : " + de.Properties["samAccountName"].Value);
            Console.WriteLine("User principal name: " + de.Properties["userPrincipalName"].Value);
            Console.WriteLine();
        }
    }
}
Console.ReadLine();

通过此代码您将获得所有用户信息

如果您想从 Active Directory 登录或编辑用户信息,我会向您发送完整代码

经过更多谷歌搜索后,我找到了适合我的方法

  1. 创建一个新的 class 来扩展 IClaimsTransformation。

    public class ClaimsTransformer : IClaimsTransformation  
    {  
        public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)  
        {  
            var wi = (WindowsIdentity)principal.Identity;  
            if (wi.Groups != null)  
            {  
                foreach (var group in wi.Groups) //-- Getting all the AD groups that user belongs to---  
                    {  
                        try  
                        {  
                            var claim = new Claim(wi.RoleClaimType, group.Value);  
                            wi.AddClaim(claim);                          
                        }  
                        catch (Exception ex)  
                        {  
                           throw ex;  
                        }  
                     }  
             }              
              return Task.FromResult(principal);  
        }  
    }
    
  2. 在 Program.cs

    中将单例添加到构建器
    builder.Services.AddSingleton<IClaimsTransformation, ClaimsTransformer>();
    
  3. 在控制器中使用 [Authorize(Roles = "YourGroupName")]

单身link:

[Authorize(Roles = "YourGroupName")]
public IActionResult Privacy()
{
   return View();
}

对于整个控制器:

[Authorize(Roles = "YourGroupName")]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
    
}

指南来自: https://www.c-sharpcorner.com/article/authorization-using-windows-active-directory-groups-in-net-core-2-razor-pages/