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

时间:2016-08-18 21:25:26

标签: c# asp.net-core asp.net-core-mvc

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

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

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

1 个答案:

答案 0 :(得分:3)

我会使用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将为false)因此您无法使用{{1与[Authorize(Roles = "")]一起使用。在这种情况下,您可以使用Claims Based Authorization来处理自动调整。

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

Authorize