在 asp.net mvc 中使用联合身份验证更新声明
Updating claims using Federated Authentication in asp.net mvc
我在我的 MVC 项目中使用 FederatedAuthentication
class。
我使用 FederatedAuthentication.SessionAuthenticationModule.CreateSessionCookie(...);
创建 cookie,但如果用户想要更改例如他们的名字,我似乎无法找到更新它们的方法。
如何在不注销的情况下访问和更新声明?
过程比较简单
- 获取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);
}
我在我的 MVC 项目中使用 FederatedAuthentication
class。
我使用 FederatedAuthentication.SessionAuthenticationModule.CreateSessionCookie(...);
创建 cookie,但如果用户想要更改例如他们的名字,我似乎无法找到更新它们的方法。
如何在不注销的情况下访问和更新声明?
过程比较简单
- 获取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); }