2015-08-28 5 views
1

Я использую класс FederatedAuthentication в своем проекте MVC.Обновление заявок с использованием федеративной аутентификации в asp.net mvc

Чтобы создать файл cookie, я использую FederatedAuthentication.SessionAuthenticationModule.CreateSessionCookie(...);, но я не могу найти способ обновить их, если пользователь хочет изменить, например, свое имя.

Как я могу получить доступ и обновить претензии без выхода из системы?

ответ

1

Процесс довольно довольно легко

  1. Получить список текущих претензий ClaimsPrincipal
  2. Удалите требования, которые вы хотите обновить
  3. Добавить новые претензии
  4. Идентифицироваться как обычно, проходя список претензий.

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