Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IdentityServer3在部分登录期间更改主体ID/用户名_C#_Asp.net_.net_Identityserver3 - Fatal编程技术网

C# IdentityServer3在部分登录期间更改主体ID/用户名

C# IdentityServer3在部分登录期间更改主体ID/用户名,c#,asp.net,.net,identityserver3,C#,Asp.net,.net,Identityserver3,我们正在使用IdentityServer3实现自己的SSO提供程序。我们几乎完成了,只是我们有一个要求,当用户第一次登录时,他们必须更改用户名、密码并提供其他信息。问题在于用户名的更改:它还需要更改主题id,这样当部分登录完成时,客户端也会收到新用户名,而不是旧用户名 因此,我们需要的是一种方法,在部分登录中,更改sub声明。在互联网上搜索这个问题并没有给我任何有用的结果。我已尝试更改声明,但我无法使其在post请求之后继续存在。我已经做了以下工作: var ctx = Request.GetO

我们正在使用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));

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

我刚才在查看
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);
上面的代码证明是我的解决方案