2016-11-14 32 views
0

我們正在使用IdentityServer3實施我們自己的SSO提供程序。我們幾乎完成,除了我們有要求,當用戶第一次登錄時,他們將不得不更改他們的用戶名,密碼並提供其他信息。問題在於用戶名的變化:它還需要更改主題ID,因此當部分登錄完成時,客戶端也會收到新用戶名,而不是舊用戶名。IdentityServer3在部分登錄期間更改主題/用戶名

因此,我們需要的是在部分登錄中更改sub聲明的方法。在互聯網上搜索這個問題並沒有給我任何有用的結果。我試圖改變這一說法,但是我無法讓它在發佈請求之外持續存在。我做了以下幾點:

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

這不幸的是,不起作用,因爲我這裏的索賠只是副本。什麼是改變主題的正確方法?

回答

1

我剛剛在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); 

上面的代碼證明是我的解決方案。