我的主要目标是使用 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() { }