2013-04-29 12 views
9

È possibile restituire una risposta di autenticazione personalizzata? Ho già il mio provider di autenticazione personalizzato che eredita da CredentialsAuthProvider.Restituisce un oggetto di risposta dell'autorizzazione personalizzato dall'autenticazione di ServiceStack

voglio tornare la data di scadenza della sessione nella risposta, in modo che il cliente sa esattamente quando la loro sessione di server scade:

{ 
    "sessionId": "bG27SdxbRkqJqU6xv/gvBw==", 
    "userName": "[email protected]", 
    "sessionExpires": "2013-04-29T03:27:14.0000000", 
    "responseStatus": {} 
} 

posso ignorare il metodo di autenticazione in questo modo:

public override object Authenticate(IServiceBase authService, IAuthSession session, Auth request) 
{ 
    // get base response 
    var response = base.Authenticate(authService, session, request); 

    // grab the session 
    var customSession = authService.GetSession() as CustomUserSession; 

    // if response can be cast and customSession exists 
    if (response is AuthResponse && customSession != null) 
    { 
     // cast 
     var authResponse = response as AuthResponse; 

     // build custom response 
     var customAuthResponse = new CustomAuthResponse 
      { 
       ReferrerUrl = authResponse.ReferrerUrl, 
       SessionExpiry = customSession.SessionExpires, 
       SessionId = authResponse.SessionId, 
       ResponseStatus = authResponse.ResponseStatus, 
       UserName = authResponse.UserName 
      }; 
     return customAuthResponse; 
    } 

    // return the standard response 
    return response; 
} 

Funziona bene, tranne nel caso in cui la sessione sia già attiva. In tal caso, i AuthService postali metodo per una sessione valida e automatically returns a standard AuthResponse, e non c'è modo ovvio per ignorarlo:

var alreadyAuthenticated = response == null; 
response = response ?? new AuthResponse { 
    UserName = session.UserAuthName, 
    SessionId = session.Id, 
    ReferrerUrl = referrerUrl, 
}; 

Seguendo le idee di Paaschpa seguito, le seguenti forze ri-auth per sempre essere ri-autenticati , ma sembra che ci potrebbero essere rischi connessi lasciando più sessioni attive aperta:

public override bool IsAuthorized(IAuthSession session, IOAuthTokens tokens, Auth request = null) 
{ 
    // force re-authentication. Not great, but no other obvious way to do this 
    if (request != null) 
    { 
     return false; // auth or re-auth calls 
    } 

    return base.IsAuthorized(session, tokens, request); 
} 

qualcuno può pensare a un modo migliore per fare questo? Potrei implementare il mio AuthenticationService, ma non sono sicuro di come ignorare AuthFeature?

+0

fa qualcosa del genere di aiuto? https://github.com/ServiceStack/ServiceStack/wiki/Sessions#using-typed-sessions-in-servicestack – paaschpa

+0

@paaschpa purtroppo no. Quel valore di sessione personalizzato è qualcosa che si tiene sul server. Voglio esporre una risposta di autenticazione personalizzata. Semmai è più come questo: http://stackoverflow.com/questions/13855996/how-to-change-http-401-response-in-servicestack ma per un login riuscito, piuttosto che uno fallito. – Junto

risposta

3

Se ho capito correttamente, si desidera restituire una risposta personalizzata dopo che un utente effettua l'autenticazione con '/auth/credentials'. Dal momento che hai già il tuo CredentialsAuthProvider, penso che potresti semplicemente ignorare l'autenticazione e restituire la tua risposta.

sottoclasse di CredentialsAuthProvider

public class MyCredentialsAuthProvider : CredentialsAuthProvider 
{ 
    public override object Authenticate(ServiceStack.ServiceInterface.IServiceBase authService, IAuthSession session, Auth request) 
    { 
     //let normal authentication happen 
     var authResponse = (AuthResponse)base.Authenticate(authService, session, request); 

     //return your own class, but take neccessary data from AuthResponse 
     return new 
      { 
       UserName = authResponse.UserName, 
       SessionId = authResponse.SessionId, 
       ReferrerUrl = authResponse.ReferrerUrl, 
       SessionExpires = DateTime.Now 
      }; 

    } 
} 
+0

Ho già praticamente questo in esecuzione come tu hai sopra. Tuttavia, se si richiama di nuovo/auth con le stesse credenziali, mentre la sessione è ancora valida (cioè non scaduta), viene restituita una risposta AuthResponse invece di una MyCustomAuthResponse. Sembra che in quello scenario, il metodo di autenticazione non viene raggiunto. Penso che dovrei fare questo più avanti la catena. Forse sostituisci Post(). – Junto

+0

hmmm ... è possibile sovrascrivere IsAuthorized per restituire sempre false e aggiungere la logica agli altri override per gestire il caso di una sessione utente già autorizzata/autenticata. Sembra abbastanza rischioso, però. – paaschpa

+0

Oltre alla creazione di più sessioni attive per lo stesso utente, puoi pensare ad altri rischi? – Junto

Problemi correlati