È 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?
fa qualcosa del genere di aiuto? https://github.com/ServiceStack/ServiceStack/wiki/Sessions#using-typed-sessions-in-servicestack – paaschpa
@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