部分登录时,IdentityServer3 change subjectid/username

本文关键字:change subjectid username IdentityServer3 登录 | 更新日期: 2023-09-27 18:17:54

我们正在使用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 change subjectid/username

我刚刚发现,而在寻找IdentityServer3.Core.Extensions.OwinEnvironmentExtensions类,相同的扩展类,主机GetIdentityServerPartialLoginAsync()方法,有一个名为UpdatePartialLoginClaimsAsync()的方法。这个方法接受一个可枚举的索赔,所以我给了它我的新的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);

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