.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 组一起使用以获得权限。
我不确定这对活动目录是否有帮助,
或
这导致针对 AD 对用户进行身份验证,并且提供了组方法。
对于 Win 身份验证,我可以使用
希望对您有所帮助!
用于连接到 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 登录或编辑用户信息,我会向您发送完整代码
经过更多谷歌搜索后,我找到了适合我的方法
创建一个新的 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);
}
}
在 Program.cs
中将单例添加到构建器
builder.Services.AddSingleton<IClaimsTransformation, ClaimsTransformer>();
在控制器中使用 [Authorize(Roles = "YourGroupName")]
单身link:
[Authorize(Roles = "YourGroupName")]
public IActionResult Privacy()
{
return View();
}
对于整个控制器:
[Authorize(Roles = "YourGroupName")]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
正在学习dotnet core 6,正在申请Intra。我需要从公司的 Active Directory (WinServer) 获取用户数据(用户名和姓氏,以及用户组)。我还需要允许访问基于 AD 用户组的页面。
我试过 Google 它,但从未成功找到 material,如何实现它。
任何人都可以给我指明方向或展示实施示例吗?现在我已经安装了 Identity 包,但我需要我的应用程序与 Windows Auth 和 Active Directory 组一起使用以获得权限。
我不确定这对活动目录是否有帮助,
或
这导致针对 AD 对用户进行身份验证,并且提供了组方法。
对于 Win 身份验证,我可以使用
希望对您有所帮助!
用于连接到 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 登录或编辑用户信息,我会向您发送完整代码
经过更多谷歌搜索后,我找到了适合我的方法
创建一个新的 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); } }
在 Program.cs
中将单例添加到构建器builder.Services.AddSingleton<IClaimsTransformation, ClaimsTransformer>();
在控制器中使用 [Authorize(Roles = "YourGroupName")]
单身link:
[Authorize(Roles = "YourGroupName")]
public IActionResult Privacy()
{
return View();
}
对于整个控制器:
[Authorize(Roles = "YourGroupName")]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}