我的主要目标是使用Windows身份验证来查询我的自定义Users表,以便通过Web应用程序使用。我不确定有这样做的传统方式。
我在SQL数据库中有一个预定义的Users表和Roles表。如何使用User.Identity.Name
查询此Users表并将所有表数据以及角色映射到ApplicationUser
类,以后可以在Intranet Web应用程序中进一步使用?
通过阅读大量文章,我无法找到与我所追求的密切相关的任何内容。我假设这将在Startup
下的ConfigureServices
类中完成,但我也不确定。我需要在第一次导航到网站时查找用户。
答案 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