我正在将旧应用程序移植到 ASP.NET Core,它使用 Windows 身份验证(在 IIS 中配置,分别为 launchsetting.json)。
在开发模式下运行时,我想覆盖身份验证以使用自定义硬编码的 ClaimsPrincipal。
public class Startup
{
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
}
}
我不确定设置身份和服务/中间件配置的正确位置是什么......
有一种编辑现有身份的正确方法,称为声明转换。基本上,我们必须编写一个实现 IClaimsTransformation 接口的自定义类。文档没有提供太多相关信息,但最重要的是——我们需要克隆给定的身份。
简而言之,这个过程是这样的:
-
克隆当前用户身份
-
添加自定义声明
-
返回克隆身份
public class AddRolesClaimsTransformation : IClaimsTransformation
{
private readonly IUserService _userService; public class AddRolesClaimsTransformation : IClaimsTransformation
{
private readonly IUserService _userService;
public AddRolesClaimsTransformation(IUserService userService)
{
_userService = userService;
}
public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
// Clone current identity
var clone = principal.Clone();
var newIdentity = (ClaimsIdentity)clone.Identity;
// Support AD and local accounts
var nameId = principal.Claims.FirstOrDefault(c => c.Type ==
ClaimTypes.NameIdentifier || c.Type == ClaimTypes.Name);
if (nameId == null)
{
return principal;
}
// Get user from database
var user = await _userService.GetByUserName(nameId.Value);
if (user == null)
{
return principal;
}
// Add role claims to cloned identity
foreach (var role in user.Roles)
{
var claim = new Claim(newIdentity.RoleClaimType, role.Name);
newIdentity.AddClaim(claim);
}
return clone;
} }
最后要做的事情是在 Startup 类的 ConfigureServices() 方法中通过依赖注入注册声明转换。
services.AddScoped<IClaimsTransformation, AddRolesClaimsTransformation>();
enter code here
基于https://gunnarpeipman.com/aspnet-core-adding-claims-to-existing-identity/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)