具有特定于应用程序的声明角色和授权的 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"));
现在用户有两个身份,一个是原始身份,一个包含特定于应用程序的声明。如果我理解正确的话,似乎工作得很好。
情况如下:我正在尝试使用 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"));
现在用户有两个身份,一个是原始身份,一个包含特定于应用程序的声明。如果我理解正确的话,似乎工作得很好。