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.
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
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
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