>我正在使用Windows身份验证,以及一个自定义IClaimsTransformation
,我在数据库中查找用户名以检索一些自定义角色,并像这样添加到身份中:
identity.AddClaim(new Claim(ClaimTypes.Role, "MyRole"));
在我的控制器顶部,我有[Authorize(Roles = "MyRole")]
但是当我访问页面时,我收到以下错误消息:
主域和受信任域之间的信任关系失败
(如果我注释掉 [授权] 行,它会起作用,但这当然不是解决方案(。
我的创业.cs看起来像这样:-
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddAuthorization();
services.AddScoped<IClaimsTransformation, ApplicationClaimsTransformer>();
...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
...
}
我做错了什么?我的角色名称不是 AD 角色 - 只是我的应用程序中的任意字符串(我怀疑这是问题所在(,那么我如何才能让它工作?
编辑
我发现如果我从自定义声明转换器返回 GenericPrincipal,那么这似乎可以解决问题。不确定这是"正确"的做事方式,还是将来可能会回来咬我?
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
var identity = (ClaimsIdentity)principal.Identity;
var username = identity.Name;
var rolenames = ... Look up role names from the database ...
var genIdentity = new GenericIdentity(username);
var genPrincipal = new GenericPrincipal(genIdentity, rolenames);
return Task.FromResult(new ClaimsPrincipal(genPrincipal));
}
按照@torendil的要求,我已将"编辑"从我的问题中移出并进入答案:-
我发现如果我从自定义声明转换器返回 GenericPrincipal,那么这似乎可以解决问题。不确定这是"正确"的做事方式,还是将来可能会回来咬我?
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
var identity = (ClaimsIdentity)principal.Identity;
var username = identity.Name;
var rolenames = ... Look up role names from the database ...
var genIdentity = new GenericIdentity(username);
var genPrincipal = new GenericPrincipal(genIdentity, rolenames);
return Task.FromResult(new ClaimsPrincipal(genPrincipal));
}