2016-02-04 34 views
7

Mam dwie witryny: https://www.somesite.com (strona użytkownika) i https://admin.anothersite.com (strona administracyjna) i używam serwera tożsamości 3 do kontroli dostępu, jest on hostowany pod numerem https://identity.somesite.com.Serwer tożsamości i podszywanie się pod użytkownika

Witryny są konfigurowane na serwerze tożsamości jako ten sam klient (różne adresy URL przekierowania) z uwierzytelnianiem opartym na plikach cookie. Chciałbym udostępnić mechanizm, w którym użytkownicy witryny administracyjnej mogą podszywać się pod użytkowników witryny użytkownika.

Widziałem, że mogę wydawać ciasteczka za pomocą IssueLoginCookie, ale to połączenie musi być na serwerze tożsamości, więc biorąc pod uwagę, że jest to w innej domenie, nie widzę, jak by to działało.

W jaki sposób mogę pomóc w podszywaniu się pod użytkownika w serwerze tożsamości?

Aktualizacja

Mam teraz miejsce Administrator wygenerować url tak:

var url = 'http://localhost:61826/connect/authorize' 
    + '?state=' + encodeURIComponent(((Date.now() + Math.random()) * Math.random()).toString().replace(".", "")) 
    + '&nonce=' + encodeURIComponent(((Date.now() + Math.random()) * Math.random()).toString().replace(".", "")) 
    + '&client_id=mvc' 
    + '&redirect_uri=' + encodeURIComponent('http://localhost:64822/') 
    + '&scope=' + encodeURIComponent('openid profile roles api1') 
    + '&acr_values=' + encodeURIComponent('loginas:3230') 
    + '&response_type=' + encodeURIComponent('id_token token') 
    + '&prompt=login'; 

window.location.href = url; 

Pozwala mi to pickup zdarzenie logowania w metodzie PreAuthenticateAsync na moim zwyczajem IUserService i przechwycić login . Moja obecna implementacja to:

public override async Task PreAuthenticateAsync(PreAuthenticationContext context) 
{ 
    if (context.SignInMessage.AcrValues.Any(acr => acr.StartsWith("loginas:"))) 
    { 
     // Would need to also ensure that the user has the relevant persmissions to impersonate another user 
     var subjectId = _owinContext.Authentication.User.GetSubjectId(); 

     var login = new AuthenticatedLogin 
     { 
      Name = "Impersonating For Fun", 
      Subject = "3230", 
      Claims = new List<Claim> 
      { 
       new Claim(Constants.ClaimTypes.Subject, "3230") 
      }, 
      PersistentLogin = true, 
      IdentityProvider = Constants.BuiltInIdentityProvider, 
      AuthenticationMethod = "Cookies" 
     }; 

     _owinContext.Environment.IssueLoginCookie(login); 

     var impersonationClaims = new List<Claim> 
     { 
      new Claim("AdminUserId", subjectId) 
     }; 

     context.AuthenticateResult = new AuthenticateResult("3230", "Impersonating For Fun", impersonationClaims); 
    } 

    await Task.FromResult(0); 
} 

Użytkownik nie jest wyświetlany na stronie logowania i jest poprawnie przekierowany do docelowego adresu URL. Jednak użytkownik nie został zmieniony na nowego użytkownika, ale pozostaje jako oryginalny użytkownik. czego mi brakuje?

Odpowiedz

0

Czy ustawiasz plik cookie w całej domenie? Czy możesz to potwierdzić w przeglądarce?

Powiązane problemy