【问题标题】:Updating claims using Federated Authentication in asp.net mvc在 asp.net mvc 中使用联合身份验证更新声明
【发布时间】:2015-08-28 17:59:08
【问题描述】:
我在我的 MVC 项目中使用 FederatedAuthentication 类。
要创建 cookie,我使用 FederatedAuthentication.SessionAuthenticationModule.CreateSessionCookie(...);,但如果用户想要更改他们的名字,我似乎无法找到更新它们的方法。
如何在不注销的情况下访问和更新声明?
【问题讨论】:
标签:
asp.net-mvc
federated-identity
【解决方案1】:
这个过程相当简单
- 获取 ClaimsPrincipal 的当前声明列表
- 删除您要更新的声明
- 添加新声明
-
像往常一样进行身份验证,传递声明列表。
var claims = FederatedAuthentication.SessionAuthenticationModule
.ContextSessionSecurityToken.ClaimsPrincipal.Claims.ToList();
var givenNameClaim = claims.Single(x => x.Type == "given_name");
var familyNameClaim = claims.Single(x => x.Type == "family_name");
var timeZoneClaim = claims.Single(x => x.Type == "time_zone_string");
var newName = new Claim(givenNameClaim.Type.ToString(), model.FirstName, givenNameClaim.ValueType, givenNameClaim.Issuer);
var familyName = new Claim(familyNameClaim.Type.ToString(), model.LastName, familyNameClaim.ValueType, familyNameClaim.Issuer);
var timeZone = new Claim(timeZoneClaim.Type.ToString(), model.SelectedTimeZone, timeZoneClaim.ValueType, timeZoneClaim.Issuer);
UpdateClaims(newName, familyName, timeZone);
public void UpdateClaims(params Claim[] updatedClaims)
{
var currentClaims = FederatedAuthentication.SessionAuthenticationModule.ContextSessionSecurityToken.ClaimsPrincipal.Claims.ToList();
foreach (var claim in updatedClaims)
{
currentClaims.Remove(currentClaims.Single(x => x.Type == claim.Type));
currentClaims.Add(claim);
}
var principal = new ClaimsPrincipal(new ClaimsIdentity[] { new ClaimsIdentity(currentClaims, "Auth0") });
var session = FederatedAuthentication.SessionAuthenticationModule.CreateSessionSecurityToken(
principal,
null,
DateTime.UtcNow,
DateTime.MaxValue.ToUniversalTime(),
true);
FederatedAuthentication.SessionAuthenticationModule.AuthenticateSessionSecurityToken(session, true);
}