2016-08-18 97 views
3

我的主要目标是使用Windows身份验证来查询我的自定义用户表以通过Web应用程序使用。我不确定是否有这样做的传统方式。如何在数据库中使用Windows身份验证与用户

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

从阅读大量文章后,我无法找到与我有关的任何东西。我认为这将在StartupConfigureServices下完成,但我也不确定这一点。我需要在用户第一次浏览该网站时查找用户。

回答

2

我会用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<ClaimsPrincipal> 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<IClaimsTransformer>(); 
      return await transformer.TransformAsync(context); 
     }); 
     //... 
    } 

不幸的是User.IsInRole方法不能与ClaimsTransformer工作(如果添加与ClaimsTransformer作用,IsInRole会假),所以你不能使用[Authorize(Roles = "")]ClaimsTransformer。在这种情况下,您可以使用Claims Based Authorization来处理自动化。

所以最后下面的代码添加到ConfigureServices和使用Authorize属性:

public void ConfigureServices(IServiceCollection services) 
    { 
     // Add framework services. 
     services.AddSingleton<IClaimsTransformer, ClaimsTransformer>(); 
     services.AddAuthorization(options => 
     { 
      options.AddPolicy("RequireAdministratorRole", policy => policy.RequireClaim(ClaimTypes.Role, "Administrator")); 
     }); 
     //... 
    } 

    [Authorize(Policy = "RequireAdministratorRole")] 
    public IActionResult Index() { } 
+0

我相信这正是我之后。我执行后会标记正确,并确保我没有其他问题。 – HuntK24

相关问题