如何对数据库中的用户使用Windows身份validation

我的主要目标是使用Windows身份validation来查询我的自定义Users表以通过Web应用程序使用。 我不确定有这样做的传统方法。

我在SQL数据库中有一个预定义的Users表和Roles表。 如何使用User.Identity.Name查询此Users表并将所有表数据以及角色映射到ApplicationUser类,以后可以在Intranet Web应用程序中进一步使用?

通过阅读大量文章,我无法找到与我所追求的任何密切相关的东西。 我假设这将在ConfigureServices下的Startup类中完成,但我也不确定。 我需要在第一次导航到网站时查找用户。

我会使用ClaimsTransformer来获取用户声明。 我将尝试展示如何获取用户声明并处理Windows Authenticatin的授权。

首先创建一个ClaimsTransformer类:

 public class ClaimsTransformer : IClaimsTransformer { // i assume you have a user service in which you get user info via entity framework private readonly IUserService _userService; public ClaimsTransformer(IUserService userService) { _userService = userService; } public async Task TransformAsync(ClaimsTransformationContext context) { var identity = ((ClaimsIdentity)context.Principal.Identity); // ... add user claims if required var roles = _userService.GetRoles(identity.Name); foreach(var role in roles) { identity.AddClaim(new Claim(ClaimTypes.Role, role)); } return await Task.FromResult(context.Principal); } } 

然后在Configure方法中使用它

  public void Configure(IApplicationBuilder app) { //... app.UseClaimsTransformation(async (context) => { IClaimsTransformer transformer = context.Context.RequestServices.GetRequiredService(); return await transformer.TransformAsync(context); }); //... } 

遗憾的是, User.IsInRole方法不能与ClaimsTransformer一起ClaimsTransformer (如果使用ClaimsTransformer添加角色,IsInRole将为false),因此您不能将[Authorize(Roles = "")]ClaimsTransformer一起ClaimsTransformer 。 在这种情况下,您可以使用基于声明的授权来处理自动调整。

最后将下面的代码添加到ConfigureServices并使用Authorize属性:

  public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddSingleton(); services.AddAuthorization(options => { options.AddPolicy("RequireAdministratorRole", policy => policy.RequireClaim(ClaimTypes.Role, "Administrator")); }); //... } [Authorize(Policy = "RequireAdministratorRole")] public IActionResult Index() { }