6

Wir bauen eine Plattform, wo der Client ein ASP .Net MVC ist, mit ASP Net Identity 2.0 zur Authentifizierung und Autorisierung (mit Ansprüchen), die auf der Webseite.ASP.Net MVC und WCF Identity (Claims) Integration

Wir haben auch einen WCF-Dienst, der CRUD-Operationen in der Datenbank (für mehrere Client-Anwendungen) erlaubt, die Anfragen von diesem ASP .Net MVC-Client erhält. Da wir den Benutzer validieren (authentifizieren & autorisieren) wollen, bevor Sie bestimmte CRUD - Aktionen auf der WCF - Seite ausführen, müssen wir die Ansprüche des Benutzers vom Client abrufen und die Validierungen durchführen (vorzugsweise auf sehr saubere Weise mit Kopfzeilen oder jede Bindung, die WCF in dieser Angelegenheit unterstützen kann).

Ich habe die verschiedenen Foren, aber ohne einfache Antwort \ tutorial zu diesem speziellen Szenario gesucht. Kann jemand in dieser Angelegenheit helfen?

Danke, Nir.

+0

Nir, Ihr Problem scheint die Ansprüche an Ihren WCF-Dienst zu übergeben. Sie können die tatsächlichen Ansprüche weitergeben, die Sie von Identity erhalten, oder Sie können einem Array oder DTO die Werte übergeben, die die Berechtigungen und IDs darstellen, die Sie an Ihren Service weitergeben möchten ... –

+0

@nirpi, was möchten Sie, dass Ihr Service konsumiert? : Anmeldeinformationen oder Sicherheitstoken? –

+0

@DaveAlperovich, ich würde gerne die Ansprüche aus der Kopfzeile, wenn möglich, so dass ich nicht alle meine öffentlichen Methoden mit zusätzlichen Parametern für die Authentifizierung "dreckig" müssen. – nirpi

Antwort

1

I love this:

in Ihrer IEndpointBehavior Implementierung tun dies auf der Client-Seite:

public object BeforeSendRequest(ref Message request, IClientChannel channel) 
    { 
     request.Headers.Add(MessageHeader.CreateHeader("token", "http://myurl.com/service/token", _theToken)); 
     return null; 
    } 

dann auf den Dienst Ende fügen Sie diese zu Ihrer ServiceAuthenticationManager

public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(
     ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri, ref Message message) 
    { 
     IPrincipal user = new MyUserPrincipal(null); 

     if(_currentServiceContractType.GetInterfaces() 
             .Any(x => x == typeof(IMySecuredService))) 
     { 
      var tokenPosition = message.Headers.FindHeader("token", "http://myurl.com/service/token"); 

      if (tokenPosition >= 0 && tokenPosition <= 5) 
      { 
       var encryptedToken = message.Headers.GetHeader<string>(tokenPosition); 

       if (!string.IsNullOrWhiteSpace(encryptedToken)) 
       { 
        var serializedToken = new MyEncryptionUtility().Decrypt(encryptedToken); 
        var token = MyTokenSerializer.Deserialize(serializedToken); 
        var expire = new DateTime(token.ValidToTicks); 
        if (expire > DateTime.Now) 
        { 
         user = new MyUserPrincipal(token); 
        } 
       } 
      } 
     } 
     message.Properties["Principal"] = user; 
     Thread.CurrentPrincipal = user; 
     return authPolicy; 
    } 

Dies gibt Ihnen dann die Möglichkeit, die eingebauten Claims oder die WIF-Claims-Authentifizierung zu nutzen. Entweder ist das sehr einfach. Das Token wird vom Dienst erstellt und an den Client (Web) gesendet und im Cookie gespeichert. Wenn es irgendwelche Anfragen gibt, wird das Token aus einem Cookie geholt und dann zum Dienst gesendet, wo Sie unweigerlich mit dem Hinzufügen von Berechtigungen auf der Service-Seite beginnen können, anstatt sie auf der web/mvc-Seite auszuführen jedermanns Lieblings-Freund, SOA> = :)