2016-07-06 17 views
1

Ich versuche, eine Lösung zu entwerfen, bei der ein ServiceStack-Server einfach ein Authentifizierungs-Cookie von ASP.NET verwenden kann. (In Wirklichkeit könnte es irgendein Cookie sein. Es bekommt nur eine Sitzungs-ID, dass es Details über einen Rückkanal nachschlagen kann). Die benutzerdefinierten Authentifizierungsprovider scheinen nicht die richtige Richtung zu sein, da sie auf gesendeten Anmeldeinformationen basieren. Stattdessen machte ein GlobalRequestFilter für mich mehr Sinn. Dort überprüfe ich den Cookie, erhalte die externen Sitzungsinformationen, setze sie dann auf die ServiceStack-Sitzung und setze IsAuthenticated. Dies funktioniert im Anforderungsdienst, da er auf die erforderlichen Sitzungsdetails zugreifen kann. Gut so weit.Benutzerdefinierte Sitzung funktioniert nicht mit Authentifizierung

Das Problem ist, dass, wenn ich beschließe, Dienste mit dem Attribut Authenticate zu sperren, es anscheinend das Attribut vor meinem Filter ausgeführt wird, so dass es immer um die Anmeldung umleiten will. Was ist der empfohlene Ort, um meine Logik hinzuzufügen, sodass sie vor dem Authenticate-Attribut ausgelöst wird und ordnungsgemäß validiert wird?

+0

nur bemerkt und geändert von GlobalRequestFilters zu PreRequestFIlters, aber immer noch keine Hilfe. immer noch 401, wenn es das Attribut Authenticate –

+0

Ich denke, ich habe es gesehen. Die tatsächliche Methode zum Ermitteln, ob die Sitzung das Authenticate-Attribut erfüllt, besteht darin, die IsAuthorized-Methode der Sitzung zu überschreiben (Sie müssen eine stark typisierte AuthUserSession erstellen) und true zurückzugeben, je nachdem, welcher Anbieter fragt. 'öffentliche Überschreibung Bool IsAuthorized (String-Provider) { Rückkehr base.IsAuthorized (Anbieter); } ' –

Antwort

2

Das Attribut [Autenticate] von ServiceStack ist für die Verwendung mit ServiceStack's AuthProvider model vorgesehen, sodass Sie weiterhin einen benutzerdefinierten AuthProvider verwenden möchten. Sie können Beispiele für das Erstellen von benutzerdefinierten Authentifizierungsanbieter am IAuthWithRequest Auth Providers in den letzten Release Notes einen Blick haben, die auf der Verwendung Anmeldeinformationen nicht basieren:

Durch Implementierung der Schnittstelle IAuthWithRequest in Ihrem AuthProvider ruft der Anforderungsfilter [Authenticate]PreAuthenticate() auf, um vor der Überprüfung, ob t Der Benutzer ist authentifiziert oder nicht. Hier können Sie die Benutzersitzung bevölkern, wenn der Benutzer authentifiziert ist, zum Beispiel:

public class MyAuthProvider : AuthProvider, IAuthWithRequest 
{ 
    public override bool IsAuthorized(IAuthSession session, IAuthTokens tokens, Authenticate request = null) 
    { 
     return session.IsAuthenticated; 
    } 

    public override object Authenticate(IServiceBase authService, IAuthSession session, Authenticate request) 
    { 
     throw new NotImplementedException("Authenticate() should not be called directly"); 
    } 

    public void PreAuthenticate(IRequest req, IResponse res) 
    { 
     //Do any Auth validation... 

     //populate the Session in the Request to Authenticate this user 
     req.Items[Keywords.Session] = new AuthUserSession { 
      UserName = ..., 
      Email = ..., 
      //populate other fields 
      IsAuthenticated = true, 
     }; 
    } 
} 

dann Ihre individuellen registrieren Auth Provider fügen Sie es Ihre AuthFeature Plugin in AppHost.Configure(), zB:

Plugins.Add(new AuthFeature(() => new AuthUserSession(), 
    new IAuthProvider[] { 
    new MyAuthProvider(), 
    })); 
+1

Danke! Ich brauche immer noch die IsAuthorized-Überschreibung auf der AuthUserSession, die ich oben erwähnt habe, aber das ist der Rest davon. –

Verwandte Themen