C# IdentityServer3在部分登录期间更改主体ID/用户名
我们正在使用IdentityServer3实现自己的SSO提供程序。我们几乎完成了,只是我们有一个要求,当用户第一次登录时,他们必须更改用户名、密码并提供其他信息。问题在于用户名的更改:它还需要更改主题id,这样当部分登录完成时,客户端也会收到新用户名,而不是旧用户名 因此,我们需要的是一种方法,在部分登录中,更改C# IdentityServer3在部分登录期间更改主体ID/用户名,c#,asp.net,.net,identityserver3,C#,Asp.net,.net,Identityserver3,我们正在使用IdentityServer3实现自己的SSO提供程序。我们几乎完成了,只是我们有一个要求,当用户第一次登录时,他们必须更改用户名、密码并提供其他信息。问题在于用户名的更改:它还需要更改主题id,这样当部分登录完成时,客户端也会收到新用户名,而不是旧用户名 因此,我们需要的是一种方法,在部分登录中,更改sub声明。在互联网上搜索这个问题并没有给我任何有用的结果。我已尝试更改声明,但我无法使其在post请求之后继续存在。我已经做了以下工作: var ctx = Request.GetO
sub
声明。在互联网上搜索这个问题并没有给我任何有用的结果。我已尝试更改声明,但我无法使其在post请求之后继续存在。我已经做了以下工作:
var ctx = Request.GetOwinContext();
var authentication = await ctx.Authentication.AuthenticateAsync(Constants.PartialSignInAuthenticationType);
authentication.Identity.RemoveClaim(identityResult.Identity.FindFirst("sub"));
authentication.Identity.AddClaim(new Claim("sub", model.NewUsername));
不幸的是,这不起作用,因为我这里的声明只是副本。更改主题的正确方法是什么?我刚才在查看
IdentityServer 3.Core.Extensions.owinenEnvironmentExtensions
类时发现,该扩展类承载了GetIdentityServer PartialLogicAsync()
方法,其中有一个名为UpdatePartialLogicInAisAsync()的方法。这个方法接受可枚举的声明,所以我给了它我的新的sub
声明,但是这导致了一些未知错误(我不知道为什么),但是当我给它之前所有的声明时,sub
声明也替换了我想要的一切
var partialLogin = await OwinContext.Environment.GetIdentityServerPartialLoginAsync();
partialLogin.RemoveClaim(identityResult.Identity.FindFirst("sub"));
partialLogin.AddClaim(new Claim("sub", model.NewUsername));
await OwinContext.Environment.UpdatePartialLoginClaimsAsync(partialLogin.Claims);
上面的代码证明是我的解决方案