2013-09-24 8 views
8

Próbuję rozszerzyć funkcje uwierzytelniania i rejestracji stosu usług. Mam uwierzytelnianie i rejestrację działa dobrze, jednak muszę dodać niestandardowe dane dla każdego użytkownika. Z dokumentacji Service Stack i wielu innych postów dowiedziałem się, że możesz dodawać własne dane za pomocą kolumny MetaData wbudowanej w tabelę UserAuth.Rozszerzanie uwierzytelniania stosu usług - zapełnianie sesji użytkownika za pomocą niestandardowych meta danych użytkownika.

stworzyłem CustomAuthRepository więc mogę ustawić meta właściwość danych UserAuth, tu jest mój zwyczaj repo:

public class CustomAuthRepository : OrmLiteAuthRepository, IUserAuthRepository 
{ 
    public UserAuth CreateUserAuth(UserAuth newUser, string password) 
    { 
     newUser.Set(new LoginInfo 
     { 
      IsActive = false, 
      PasswordNeedsReset = true 
     }); 
     return base.CreateUserAuth(newUser, password); 
    } 
} 

ta działa świetnie do ustawiania metadanych, ja skończyć z serializowanym wersji obiekt LoginInfo w kolumnie metadanych tabeli UserAuth.

Teraz, co próbuję zrobić, gdy użytkownik uwierzytelnia się, muszę zmienić AuthResponse na podstawie niektórych z tych metadanych. Na przykład, jeśli użytkownik nie jest jeszcze aktywowany, chcę zwrócić AuthResponse z właściwością IsActive = get value from custom meta data

Myślę, że mógłbym to zrobić, gdybym mógł wprowadzić moje niestandardowe metadane do AuthSession. W ten sposób w moje niestandardowe dane logowania AUTH dostawcy mogę zmienić obiekt odpowiedzi na podstawie tego, co znajduje się w AuthSession:

public class CustomCredentialsAuthProvider : CredentialsAuthProvider 
{ 
    public override object Authenticate(IServiceBase authService, IAuthSession session, Auth request) 
    { 
     var customUserAuthSession = (CustomUserAuthSession)session; 

     if (!customUserAuthSession.LoginInfo.IsActive) 
     { 
      return new 
      { 
       UserName = customUserAuthSession.UserName, 
       IsActive = customUserAuthSession.LoginInfo.IsActive 
      }; 
     } 

     var isAuthenticated = base.Authenticate(authService, session, request); 

     return isAuthenticated; 
    } 
} 

będę o tym właściwy sposób, lub czy istnieje lepszy sposób na przechowywanie i pobieranie niestandardowych meta dane ?

Jak mogę zmienić AuthResponse na podstawie niestandardowych metadanych użytkownika?

Jak mogę wprowadzić własne dane meta do AuthSession?

Edytuj Zbliżam się do tego, co próbuję zrobić. W CustomAuthSession OnAuthenticated() metoda moim:

public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens tokens, Dictionary<string, string> authInfo) 
    { 
     var customUserAuthSession = (CustomUserAuthSession) session; 

     var userAuth = authService.ResolveService<IUserAuthRepository>().GetUserAuth(session, null); 
     customUserAuthSession.LoginInfo = userAuth.Get<LoginInfo>(); 

     authService.SaveSession(customUserAuthSession); 

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

ja refetching się UserAuth i wypełniania sesję z danymi, że muszę. Na podstawie stosu serwisowego documentation dla niestandardowej sesji użytkownika należy zapisać sesję po wypełnieniu jej niestandardowymi danymi. Robię to, ale wydaje się, że nie oszczędza. W mojej metodzie CustomCredentialsAuthProvider, Authenticate, nie widzę niestandardowych danych dodanych do sesji.

Edit Problem z mojej pierwszej edycji powyżej jest to, że użytkownik zostanie uwierzytelniony, wówczas mamy do kodu CustomAuthSession Gdzie mogę sprawdzić, czy są one aktywne, czy nie. W przypadku, gdy nie są aktywne, musiałbym je wylogować, a nie idealnie.

Znalazłem zamiast tego, że mogę to wszystko zrobić w metodzie Uwierzytelnianie mojego CredentialsAuthProvider.

public override object Authenticate(IServiceBase authService, IAuthSession session, Auth request) 
    { 
     var userAuthRepo = authService.ResolveService<IUserAuthRepository>(); 
     var userAuth = userAuthRepo.GetUserAuthByUserName(request.UserName); 
     var loginInfo = userAuth.Get<LoginInfo>(); 

     if (!loginInfo.IsActive) 
     { 
      return new CustomAuthResponse 
      { 
       UserName = userAuth.UserName, 
       ResponseStatus = new ResponseStatus("500"), 
       IsActive = loginInfo.IsActive 
      }; 
     } 

     var authResponse = (AuthResponse)base.Authenticate(authService, session, request); 

     return authResponse; 
    } 

Gdy nadejdzie żądanie mogę użyć nazwy użytkownika w żądaniu, aby pobrać UserAuth, i sprawdzić, czy IsActive użytkownika, czy nie. Jeśli nie, mogę zwrócić błąd, zanim Service Stack je uwierzytelni.

Myślę, że to działa dobrze na to, co próbuję zrobić. Powinienem być w stanie zwrócić błąd klientowi, mówiąc, że użytkownik nie jest aktywny.

Jeśli ktoś ma lepszy sposób na zrobienie tego, byłoby wspaniale.

+0

Może ten link może ci pomóc [Dostosowywanie programu IAuthProvider do ServiceStack.net - krok po kroku] (http://enehana.nohea.com/general/customizing-iauthprovider-for-servicestack-net-step-by-step/) – stefan2410

+0

dzięki za linkę nie przeczytałem tego. niestety nie pokazuje sposobu pobierania/ustawiania niestandardowych danych meta z kolumny metadanych w tabeli UserAuth. Dodaje pewne niestandardowe dane do niestandardowej sesji użytkownika w metodzie OnAuthenticated jego CustomCredentialsAuthProvider, ale jego przykład mówi "some_firstname_from_db". Jeśli mogę dowiedzieć się, jak pobrać użytkownika ponownie z bazy danych, mógłbym wypełnić sesję tą metodą. Nie wydaje się jednak bardzo czysty, ponieważ do czasu, gdy ta metoda zostanie nazwana Service Stack już pobrana, mój użytkownik zweryfikuje swoje wiarygodności i nazwał tę metodę post auth – officert

+0

Istnieją również inne linki. jeśli ich nie znalazłeś, [tutaj] (https://github.com/ServiceStack/ServiceStack/wiki/Authentication-and-authorization#custom- authenthentication-and-authorization) i [tutaj] (http: // rossipedia. com/blog/2013/03/simple-api-key-authentication-with-servicestack /), [tutaj] (http://dylanbeattie.blogspot.gr/2013/08/building-servicestack-based-oauth2.html) , [tutaj] (http://joeriks.com/2013/01/12/cors-basicauth-on-servicestack-with-custom-authentication/) Większość facetów jest aktywnych w SO-servicestack, więc może później odpowiedzieć Twoje pytanie. – stefan2410

Odpowiedz

8

Oto moja odpowiedź. To działa i mogę zrobić to, co próbuję zrobić, ale chciałbym usłyszeć od niektórych użytkowników usługi Service Stack, czy jest to najlepszy sposób, aby to osiągnąć.

zapisać dane niestandardowych meta

Utwórz nową klasę, która podklasy OrmLiteAuthRepository. W moim przypadku po prostu chcę korzystać z wbudowanej w Sql bazy danych Service Stack i utrzymywać ją w bazie danych.

Ponownie wdrażać metodę CreateUserAuth Aby zapisać metadane niestandardowe:

public UserAuth CreateUserAuth(UserAuth newUser, string password) 
    { 
     newUser.Set(new AccountStatus 
     { 
      IsActive = false, 
      PasswordNeedsReset = true 
     }); 
     return base.CreateUserAuth(newUser, password); 
    } 

Pobieranie niestandardowych metadanych

Utwórz nową klasę, która podklasy z CredentialsAuthProvider. Zastąp metodę Authenticate.

public override object Authenticate(IServiceBase authService, IAuthSession session, Auth request) 
    { 
     var userAuthRepo = authService.ResolveService<IUserAuthRepository>(); 
     var userAuth = userAuthRepo.GetUserAuthByUserName(request.UserName); 
     var accountStatus= userAuth.Get<AccountStatus>(); 

     if (!accountStatus.IsActive) 
     { 
      throw new InvalidOperationException(string.Format("User {0} is not activated.", request.UserName)); 
     } 
     if (!accountStatus.PasswordNeedsReset) 
     { 
      throw new InvalidOperationException("Your password needs to be reset before you can login."); 
     } 

     var authResponse = (AuthResponse)base.Authenticate(authService, session, request); 

     return authResponse; 
    } 

Gdy żądanie uwierzytelnienia wchodzi w tę metodę, pobierz UserAuth i niestandardowe dane meta. Jeśli użytkownik jest nieaktywny lub jego hasło wymaga zresetowania, wyślij wyjątek InvalidOperationException z komunikatem o błędzie.

W kontrolerze logowania do aplikacji klienckiej mogę sprawdzić komunikat o błędzie wracający z usługi i przekierować użytkownika na stronę informującą, że konto nie jest jeszcze aktywne lub jego hasło musi zostać zresetowane, zanim będzie można je uwierzytelnić.

Powiązane problemy