ASP.Net 核心 + 风身份验证 + 自定义角色:"The trust relationship between the primary domain and the trusted domain



>我正在使用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));
}

相关内容

最新更新