2016-02-04 17 views
7

Ho due siti https://www.somesite.com (sito utente) e https://admin.anothersite.com (sito di amministrazione) e sto utilizzando Identity Server 3 per il controllo accessi, questo è ospitato su https://identity.somesite.com.Identity Server e User User

I siti sono configurati nel server di identità come lo stesso client (URL di reindirizzamento diversi) con autenticazione basata su cookie. Mi piacerebbe fornire un meccanismo in cui gli utenti del sito admin possano impersonare gli utenti del sito dell'utente.

Ho visto che posso rilasciare i cookie utilizzando lo IssueLoginCookie, ma quella chiamata deve essere sul server di identità, quindi dato che si trova su un altro dominio, non riesco a vedere come funzionerebbe.

Come posso supportare il furto d'identità dell'utente nel server di identità?

Aggiornamento

Ora ho l'amministratore del sito generare un URL in questo modo:

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; 

Questo mi permette di pick-up l'evento di accesso nel metodo PreAuthenticateAsync sulla mia abitudine IUserService e intercettare il login . La mia attuale implementazione è:

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

L'utente non viene visualizzata la pagina di accesso e viene correttamente reindirizzato all'URL di destinazione. Tuttavia, l'utente non è cambiato con il nuovo utente, ma rimane come utente originale. Cosa mi manca?

risposta

0

Stai impostando il cookie del dominio? Puoi confermarlo nel browser?