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

时间:2016-07-01 23:36:54

标签: single-sign-on identityserver3 claims

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

问题是:我在哪里填写索赔/角色?我试着像下面那样添加它,但是后来两个应用程序开始看到彼此的角色。听起来不对。

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解决方案,其中每个客户端处理自己的角色声明和授权。感谢

1 个答案:

答案 0 :(得分:0)

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

我只是不确定要更换Authentication.User就像这样安全。

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

<强>更新

Ended up从

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

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

向其提供ICustomClaimProvider,它从数据库返回id的用户声明列表。然后而不是

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

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

现在,用户有两个身份,一个原件,一个包含特定于应用程序的声明。如果我理解正确,似乎运作良好。