2016-10-17 2 views
1

Ich muss etwas verpasst haben, aber ich bekomme nicht autorisierte Fehler für Operationen, die mit [Authorize] NACH einer erfolgreichen Anmeldung kommentiert werden. Ich habe die Annotation auf mehreren Ebenen ausprobiert: Die Serviceklasse, RequestDTOs und auch einzelne Methoden meiner Serviceklasse. Das Verhalten ist immer gleich.Servicestack - nach erfolgreichem Login nicht mehr authentifiziert

Ich habe meinen eigenen AuthProvider von CredentialsAuthProvider abgeleitet. Ich verwende nicht OrmLite, ich verwende NHibernate 4. Mein Client ist eine WPF-Anwendung. Mein AppHost.Configure() Methode sieht wie folgt aus:

public override void Configure(Container container) 
    { 
     //Config examples 
     //this.Plugins.Add(new PostmanFeature()); 
     //this.Plugins.Add(new CorsFeature()); 

     Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] 
      { 
       new BediCredentialsAuthProvider(), 
      } 
     )); 
     Plugins.Add(new ValidationFeature()); 
     container.RegisterValidators(typeof(AppUserValidator).Assembly); 
     container.RegisterAs<BediAuthEvents, IAuthEvents>(); 
     container.Register<ICacheClient>(new MemoryCacheClient()); 
    } 

Und dann merke ich einige andere seltsame (für mich) Verhalten: Ich brauch AuthEvents für OnAuthenticated() und OnLogout umgesetzt. Ich schreibe einen Protokolleintrag in beiden Fällen. Ich verwende die Eigenschaft session.UserAuthName in beiden Ereignissen. In OnAuthenticated() ist diese Eigenschaft korrekt ausgefüllt. Nach einem Aufruf einer Operation, bei der ich einen nicht autorisierten Fehler erhalten habe, kann die OnLogout-Methode die session.UserAuthName-Eigenschaft nicht referenzieren, da sie null ist.

Irgendeine Idee, was hier falsch läuft? Etwas scheint mit meinen Sitzungen falsch zu sein, aber ich habe keine Ahnung was!

Nachricht aktualisieren

Sorry, vertippt ich meine Anmerkung. Ich verwende [Authenticate] und nicht[Authorize]! Hier ist ein Beispiel aus meinem Dienstklasse:

[Authenticate] 
public object Post(CreateAppUser request) 
{ .... } 

[Authenticate] 
public object Put(UpdateAppUser request) 
{ .... } 

2. Update-

Hier wird der Code von meinem AuthProvider:

public class BediCredentialsAuthProvider : CredentialsAuthProvider 
{ 
    public override object Authenticate(IServiceBase authService, IAuthSession session, Authenticate request) 
    { 
     var authResponse = (AuthenticateResponse)base.Authenticate(authService, session, request); 
     var user = (AppUser)authService.Request.Items["AppUser"]; 

     authResponse.Meta = new Dictionary<string, string>(); 
     authResponse.Meta.Add("TenantName", user.TenantName); 
     authResponse.Meta.Add("ResetPwdRequired", user.MustChangePwd.ToString()); 
     authResponse.Meta.Add("IsLockedOut", user.IsLockedOut.ToString()); 
     authResponse.Meta.Add("Email", user.EmailAddress); 
     authResponse.Meta.Add("DisplayName", user.DisplayName); 
     authResponse.Meta.Add("RemoteIP", authService.Request.RemoteIp); 

     return authResponse; 
    } 
    public override bool TryAuthenticate(IServiceBase authService, string userName, string password) 
    { 
     AppUser user = null; 
     using (var session = NhSessionFactories.OpenSession(TopinConstants.TopInDbFactory)) 
     { 
      using (var transaction = session.BeginTransaction()) 
      { 
       try 
       { 
        var appUserRepo = new AccountManagementRepository(session); 
        user = appUserRepo.GetAppUser(userName); 
        transaction.Commit(); 
        session.Close(); 
       } 
       catch (Exception ex) 
       { 
        Log.Error($"Error retrieving user {user} to authenticate. Error: {ex}"); 
        throw; 
       } 
      } 
     } 
     if (user == null) 
      throw HttpError.NotFound("User '{0}' not found. Please try again.".Fmt(userName)); 

     authService.Request.Items.Add("AppUser", user); 
     var pwdMgr = new PwdManager(); 
     var hpwd = pwdMgr.GetHashedPassword(password, user.Salt); 
     return hpwd == user.Password; 
    } 
} 

Antwort

0

ServiceStack der Request FilterAttribute ein Benutzer hat Zugriff zu authentifizieren aufrufen Ein Service ist das [Authenticate] Attribut. MVC [Authorize] nicht verwandten Attribut ist für die Verwendung in MVC nur ohne Beziehung zur ServiceStack-Authentifizierung.

+0

Entschuldigung, ich habe meine Nachricht falsch geschrieben! Ich habe es korrigiert, indem ich es aktualisiert habe. – ThommyB

+0

@ThommyB ok, aber es ist nicht möglich zu sagen, was das Problem von nur dieser Beschreibung ist, ich nehme an, es ist in Ihrem benutzerdefinierten AuthProvider impl. Beachten Sie, dass Sie "MemoryCacheClient" nicht registrieren müssen, es ist bereits der Standard. Ist der 'UserAuthName' im CacheClient eingetragen, nachdem Sie sich authentifiziert haben? – mythz

+0

Ich habe die Nachricht erneut aktualisiert und den Code für meinen AuthProvider hinzugefügt. Ich registrierte MemoryCacheClient beim Suchen nach dem Problem, weil ich dachte, dass es fehlte .... – ThommyB

Verwandte Themen