部分登录期间 IdentityServer3 更改 subjectid/username

IdentityServer3 change subjectid/username during partial login

我们正在使用 IdentityServer3 实施我们自己的 SSO 提供程序。我们几乎完成了,除了我们有一个要求,当用户第一次登录时,他们必须更改他们的用户名、密码并提供其他信息。问题在于用户名的更改:它还需要更改主题 ID,因此当部分登录完成时,客户端也会收到新用户名,而不是旧用户名。

所以我们需要的是一种在部分登录中更改 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));

不幸的是,这不起作用,因为我这里的声明只是副本。正确的转移话题的方法是什么?

我刚刚在查看 IdentityServer3.Core.Extensions.OwinEnvironmentExtensions class 时发现,承载 GetIdentityServerPartialLoginAsync() 方法的相同扩展 class 有一个名为 UpdatePartialLoginClaimsAsync()。此方法接受可枚举的声明,所以我给了它我的新 sub 声明,但这导致了一些未知错误(我不确定为什么),但是当我用 [=14= 给它所有以前的声明时] 声称替换了所有我想要的东西。

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);

上面的代码被证明是我的解决方案。