2012-11-13 10 views
9

ho sovrascritto il CredentialsAuthProvider in questo modo:Come faccio a reindirizzare dopo l'autenticazione in ServiceStack

public override bool TryAuthenticate(IServiceBase authService, string userName, string password) 
     { 
      //TODO: Auth the user and return if valid login 
      return true; 
     } 

public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo) 
     { 
      base.OnAuthenticated(authService, session, tokens, authInfo); 

      //User has been authenticated 

      //Find the user's role form the DB 

      if (roleA) 
       //GOTO mypage1 

      if (roleB) 
       //GOTO mypage2 
     } 

ho eseguire un semplice post in ~/auth/poteri e mentre le opere di autenticazione e il metodo OnAuthenticated è chiamato, come faccio a reindirizzare l'utente alla pagina appropriata in base a un ruolo o qualcosa di simile?

mi stanco di fare quanto segue nel metodo OnAuthenticated, ma non ha avuto l'effetto desiderato:

authService ("/ views/clienti");.

aggiornamenti tramite Starter Template (vedi commento qui sotto):

public class CustomCredentialsAuthProvider : CredentialsAuthProvider 
    { 
     public override bool TryAuthenticate(IServiceBase authService, string userName, string password) 
     { 
      return true; 
     } 

     public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo) 
     { 
      session.ReferrerUrl = "http://www.msn.com"; 

      base.OnAuthenticated(authService, session, tokens, authInfo); 
     } 
    } 

E la forma di POST:

<form method="POST" action="/auth/credentials"> 
     <input name="UserName"/> 
     <input name="Password" type="password"/> 
     <input type="submit"/> 
    </form> 

risposta

7

I diversi luoghi dove è possibile impostare l'URL per reindirizzare durante il periodo ServiceStack Authentication, in ordine di precedenza:

  1. Il Continua QueryString, formdata o richiesta variabile DTO al momento della richiesta di /auth
  2. Il Session.ReferrerUrl URL
  3. Il HTTP Referer HTTP Header
  4. Il CallbackUrl nel AuthConfig del AuthProvider corrente usati

Dato questo ordine di preferenze, se la richiesta non ha avuto un Continua parametro, si dovrebbe utilizzare il session.ReferrerUrl, così si potrebbe fare:

if (roleA) session.ReferrerUrl = "http://myPage1Url"; 
if (roleB) session.ReferrerUrl = "http://myPage2Url"; 
+0

Questo ha funzionato ... una specie di ... ecco il comportamento: devo inviare il modulo due volte. Ecco la mia configurazione: ho una pagina di contenuto default.cshtml nella radice in cui si trova il modulo di login. Guardando il violinista, l'unica differenza che posso vedere è che, la prima volta che carico la pagina, non ho un cookie ss-id. Una volta inviato il modulo, il server mi rimanda a default.cshtml. Ma questa volta con un SSI. Se invio questa seconda volta, il reindirizzamento che hai descritto funziona. Cosa significa ss-id? – legion

+0

Un'altra nota, ottengo ss-pid e ho Plugins.Add (new SessionFeature()); in AppHost. – legion

+0

Il 'ss-id' è descritto nella [pagina Wiki della sessione di ServiceStack] (https://github.com/ServiceStack/ServiceStack/wiki/Sessions) – mythz

2

mythz,

Buona chiamata a fare questo OSS. :)

Lei ha ragione per quanto riguarda l'ordine di precedenza:

  1. La Continuare QueryString, formdata o richiesta variabile DTO quando effettua la richiesta a/auth
  2. Il Session.ReferrerUrl URL HTTP
  3. Referer HTTP Header
  4. il CallbackUrl nel AuthConfig del AuthProvider corrente utilizzato

Quindi nel mio esempio, non avevo la variabile Continue QueryString, Form Data o Request DTO, e non avevo CallbackUrl, e certamente non Session.ReferrerUrl perché questo è il primo post della Session.

Da AuthService.cs:

var referrerUrl = request.Continue 
    ?? session.ReferrerUrl 
    ?? this.RequestContext.GetHeader("Referer") 
    ?? oAuthConfig.CallbackUrl; 

Per impostazione predefinita referrerUrl avrà il valore di intestazione di provenienza dalla richiesta. Ed è quello che sta per essere assegnato alla testata posizione più in basso il metodo Post del AuthService.cs:

if (!(response is IHttpResult)) 
        { 
         return new HttpResult(response) { 
          Location = referrerUrl 
         }; 
        } 

Una volta autenticato, e il session.ReferrerUrl viene impostata qui la risposta verrà inviata al cliente con la proprietà Location sopra insieme al referente originale, non il valore di seguito:

public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo) 
     { 
      session.ReferrerUrl = "http://www.msn.com"; 
     } 

è solo sulla seconda POST della stessa sessione client navigare www.msn.com (in questo esempio) perché la sessione è già stata popolato. Penso che questo:

var referrerUrl = request.Continue 
       ?? session.ReferrerUrl 
       ?? this.RequestContext.GetHeader("Referer") 
       ?? oAuthConfig.CallbackUrl; 

Deve essere determinato dopo la chiamata a auth.

+0

Concordato, corretto [in questo commit] (https://github.com/ServiceStack/ServiceStack/commit/49833b731d2e8240353588ca060cb8bab42f0), disponibile nella prossima versione di ServiceStack alla fine della settimana. A proposito, sentitevi liberi di inviare una richiesta di pull per cose future come questa :) – mythz

+1

Awesome. Lo farò per la prossima volta, e molto, ottimo quadro. Non guarderò indietro ... Sono sicuro che l'hai già sentito, ma SS ha bisogno di più documenti e buone pratiche. – legion

+0

Penso che il [wiki di ServiceStack] (https://github.com/ServiceStack/ServiceStack/wiki) sia già abbastanza completo. È una wiki della comunità, quindi se senti che qualcosa potrebbe essere migliorato, sentiti libero di aggiungerlo. – mythz

Problemi correlati