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

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

<分区>

我的主要目标是使用 Windows 身份验证来查询我的自定义用户表以通过 Web 应用程序使用。我不确定是否有传统的方法可以做到这一点。

我在 SQL 数据库中有一个预定义的用户表和角色表。我如何使用 User.Identity.Name 查询此 Users 表并将所有表数据连同角色映射到 ApplicationUser 类,以后可以在内联网 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<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)所以您不能将 [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() { }

关于c# - 如何对数据库中的用户使用 Windows 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39027749/

相关文章:

c# - 哪种 ResponseType 应该用于 PUT 或 POST 请求的 IHttpActionResult?

C#反序列化元素映射

c# - 如何在 Asp.NET Core 2.2 中将用户 ID 的类型从 string 更改为 int?

asp.net - 脚本忽略 ASP 6

c# - 如何测量页面时间负载?

c# - html 按钮在 html 输入表单中激活 asp 验证 - 为什么?

c# - 如何在 C# 中使用多个列表选择检查 null 条件?

c# - 是否可以从自定义 TagHelper 调用 ViewComponent?

c# - SQLite EF 核心 - 'FOREIGN KEY constraint failed'

c# - 是否有内置方法来序列化数组配置值?