以下情况:我尝试使用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解决方案,其中每个客户端处理自己的角色声明和授权。感谢
答案 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"));
现在,用户有两个身份,一个原件,一个包含特定于应用程序的声明。如果我理解正确,似乎运作良好。