具有特定于应用程序的声明角色和授权的 SSO

SSO with application specific claim roles and authorization

情况如下:我正在尝试使用 IdentiyServer3 将 SSO 集成到现有的 .NET Webform/MVC/WebApi 环境中。因为没有集中的角色管理,所以 SSO 仅用于身份。每个应用程序处理自己的角色和授权。也不能要求太多更改,因此所有 IsInrole、Authorize(Role="") 和 Web.Config 角色都必须起作用。

问题是:我把 claim/role 放在哪里?我尝试像下面这样添加它,但随后两个应用程序开始看到彼此的角色。听起来不对。

Notifications = new OpenIdConnectAuthenticationNotifications {
SecurityTokenValidated = async n =>  {
    var id = n.AuthenticationTicket.Identity;
    var nid = new ClaimsIdentity(id.AuthenticationType,
        ClaimTypes.Email, ClaimTypes.Role);

    nid.AddClaim(id.FindFirst(ClaimTypes.Email));
    nid.AddClaim(new Claim(ClaimTypes.Role, "admin"));

我是不是漏掉了什么重要的东西?对不起,如果这听起来太愚蠢了。我太新了,无法更好地了解,并且没有足够的好关键字来缩小网络上的范围。

总而言之,我需要一个 SSO 解决方案,每个客户端都可以处理自己的角色声明和授权。谢谢

等一下,我认为 IdentityModel.Owin.ClaimsTransformation 的早期版本正是我所做的。我的当然没那么精致了。

我只是不确定这样替换 Authentication.User 是否安全。

var transformedPrincipal = await _options.ClaimsTransformation(context.Authentication.User);
context.Authentication.User = new ClaimsPrincipal(transformedPrincipal);

更新:

最终从

自定义了上面的 ClaimsTransformation 中间件
 public Func<ClaimsPrincipal, Task<ClaimsPrincipal>> ClaimsTransformation { get; set; }

 public Func<string, Task<List<Claim>> ClaimsTransformation { get; set; }

向其提供一个 ICustomClaimProvider,其中 return 数据库中按 ID 列出的用户声明列表。然后代替

context.Authentication.User = new ClaimsPrincipal(transformedPrincipal);

这个

context.Authentication.User.AddIdentity(new ClaimsIdentity(claims, "appid"));

现在用户有两个身份,一个是原始身份,一个包含特定于应用程序的声明。如果我理解正确的话,似乎工作得很好。