2012-05-29 10 views
8

Ich versuche ein System zu erstellen, das mit ADFS und Ansprüchen arbeitet. Im Moment ist dies nur eine "Spielzeug" -Implementierung.Delegierungstoken erstellen - kann keinen SecurityTokenService erstellen

Ich habe eine sehr einfache MVC-Webanwendung erstellt, sie mithilfe des Assistenten "Identity and Access ..." in Visual Studio eingerichtet, um mit einem ADFS 2.0-Server zu kommunizieren und sie auf einem IIS-Server bereitzustellen. Alles funktioniert gut, und ich kann die erhaltenen Ansprüche prüfen und auflisten.

Der nächste Schritt besteht darin, einen Web-API-basierten REST-Dienst zu erstellen (der Back-End-Dienste darstellt, von denen die MVC-Anwendung abhängt). Daher möchte ich die Anmeldeinformationen an diesen Back-End-Server weitergeben kann geeignete Autorisierungsentscheidungen treffen.

Also ist der erste Schritt für mich, das Delegationstoken zu erstellen (und ich werde dann hoffentlich herausfinden, was ich damit machen soll, um den Restanruf zu machen). Ich habe dies bekam:

//We need to take the bootstrap token and create an appropriate ActAs token 
var rst = new RequestSecurityToken 
{ 
    AppliesTo = new EndpointReference("https://other-iis.example.com/Rest"), 
    RequestType = RequestTypes.Issue, 
    KeyType = KeyTypes.Symmetric, 
    ActAs = new SecurityTokenElement(((BootstrapContext)((ClaimsIdentity)User.Identity).BootstrapContext).SecurityToken) 
}; 

var sts = new SecurityTokenService(); //This line isn't valid 
var resp = sts.Issue(System.Threading.Thread.CurrentPrincipal as ClaimsPrincipal, rst); 

Aber das Problem ist, dass SecurityTokenService abstrakt ist. Ich kann keine Typen finden, die von dieser Klasse in entweder System.IdentityModel oder System.IdentityModel.Services abgeleitet sind, und das oben erwähnte enthält keinen Verweis auf den ADFS-Server, den ich zu einem bestimmten Zeitpunkt natürlich bereitstellen muss.

Natürlich kann es sein, dass ich auch die falsche Route hinunterfahre oder nur einen kleinen Stolperstein treffe und nicht einen viel größeren in der Ferne auftauchen sehe, also wäre jeder Ratschlag auch zu schätzen.


Ich habe sehe zum Beispiel Identity Delegation Scenario, aber das nutzt CreateChannelActingAs, die ich glaube nicht funktionieren wird, wenn ich in eine Ruhe Dienst bin im Gespräch (oder es wird?), Und scheint auch nicht für .NET 4.5 zu gelten.

Antwort

3

Ich erhalte Token von einem ADFS 2.0 für Caching und Blick auf die DisplayToken. Vielleicht kann dies Ihnen helfen, anzufangen.

Hier ist, was ich kann, nach oben mit:

public SecurityToken GetToken(out RequestSecurityTokenResponse rstr) 
    { 
     Console.WriteLine("Connecting to STS..."); 

     WSTrustChannelFactory factory = null; 

     try 
     { 
      if (_useCredentials) 
      { 
       // use a UserName Trust Binding for username authentication 
       factory = 
        new WSTrustChannelFactory(
         new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), 
         "https://<adfs>/adfs/services/trust/13/UsernameMixed"); 

       factory.TrustVersion = TrustVersion.WSTrust13; 

       // Username and Password here... 
       factory.Credentials.UserName.UserName = "username"; 
       factory.Credentials.UserName.Password = "password"; 
      } 
      else 
      { 
       // Windows authentication over transport security 
       factory = new WSTrustChannelFactory(
        new WindowsWSTrustBinding(SecurityMode.Transport), 
        "https://<adfs>/adfs/services/trust/13/windowstransport") { TrustVersion = TrustVersion.WSTrust13 }; 
      } 

      var rst = new RequestSecurityToken 
          { 
           RequestType = RequestTypes.Issue, 
           AppliesTo = SvcEndpoint, 
           KeyType = KeyTypes.Symmetric, 
           RequestDisplayToken = true 
          }; 

      Console.WriteLine("Creating channel for STS..."); 

      IWSTrustChannelContract channel = factory.CreateChannel(); 

      Console.WriteLine("Requesting token from " + StsEndpoint.Uri); 
      SecurityToken token = channel.Issue(rst, out rstr); 
      Console.WriteLine("Received token from " + StsEndpoint.Uri); 

      return token; 
     } 
     finally 
     { 
      if (factory != null) 
      { 
       try 
       { 
        factory.Close(); 
       } 
       catch (CommunicationObjectFaultedException) 
       { 
        factory.Abort(); 
       } 
      } 
     } 
    } 

Sie könnten die UsernameMixed Endpoint in Ihrem ADFS 2.0 acivate haben, wenn Sie es verwenden möchten, und vergessen Sie nicht, den Dienst danach neu zu starten!

1

Von msdn

einen STS So erstellen Sie aus der SecurityTokenService Klasse ableiten müssen. In Ihrer benutzerdefinierten Klasse müssen Sie mindestens die Methoden GetScope und GetOutputClaimsIdentity überschreiben.

+0

Ich möchte keine STS implementieren - ich möchte mit dem ADFS sprechen und es veranlassen, ein Delegationstoken auszugeben - ich kann nicht scheinen, einen Weg zu finden, das zu tun. –

1

Nicht sicher, wie viel Ihnen das hilft, aber Sie sollten keinen SecurityTokenService erstellen. Sie erstellen hier kein neues Token, und Ihre Anwendung soll nicht als STS fungieren - dafür steht der AD FS.
Ihre Anwendung nur das Token aus dem AD FS auf den Dienst (der Begriff in der Verbindung von Msdn beschrieben wird Sie in Ihrer Frage gestellt) erhalten delegieren sollte

Erraten Im Theres eine gute Chance, die api Bahn wird suppor dies auch, wie es auf WCF gebaut, und von der http Sicht - es gibt keinen Grund, es wird nicht unterstützt eine Ws-Föderation/saml 2 Token.

EDIT:
This Video (ab 35: 00 + -) zeigt eine Art und Weise, wie ich glaube, das umzusetzen, was youre sucht, mit WS-Federation SAML-Token. Ich denke, es ist auch möglich mit einem SAML2-Token

+0

Ich habe irgendwie, dass ich nicht selbst erstellen möchte - aber ich möchte eine Anfrage an ADFS für das Delegationstoken senden - Im Idealfall suche ich nach etwas wie 'var sts = new SomeStsObject (adfsEndpointAddress); var tokan = sts.Issue (first); ', aber habe das noch nicht gefunden. –

+0

Das ist nicht wie es funktionieren soll, wenn ich es richtig verstehe; Sie dürfen keine Anzeigen für die Delegierung senden. Sie sollten sich dagegen authentifizieren und ein Token erhalten, wie Sie es in einem normalen Ablauf tun würden. Dann delegieren Sie das empfangene Token an den nächsten Verbraucher, vorausgesetzt, er vertraut ihm. Du solltest keine Codezeile haben, die sowas wie sts.Issue macht ... BTW, schau mal [diesen Link] (http://leastprivilege.com/). Ich habe nicht alles gelesen, aber es scheint, dass er an sehr ähnlichen Problemen arbeitet. – YavgenyP

+0

Was ich versuche, ist etwas wie [Identity Delegation mit ADFS 2.0] (http://technet.microsoft.com/en-us/library/adfs2-identity-delegation-step-by-step-guide (v = ws .10) .aspx), aber mein Back-End-Dienst ist REST, nicht WCF, also kann ich 'CreateChannelActingAs' oder andere WCF-Funktionen nicht verwenden. –

Verwandte Themen