2012-05-29 17 views
8

Sto provando a creare un sistema che funzioni con ADFS e attestazioni. Al momento, questa è solo un'implementazione "giocattolo".Creazione del token di delega - impossibile creare SecurityTokenService

Ho creato un'applicazione Web MVC molto semplice, l'ho configurata utilizzando la procedura guidata "Identità e accesso ..." in Visual Studio per comunicare con un server ADFS 2.0 e distribuirla su un server IIS. Tutto funziona bene e posso esaminare ed elencare le richieste ricevute.

Il passaggio successivo è la creazione di un servizio REST basato su API Web (che rappresenti i servizi di back-end da cui dipenderà l'applicazione MVC), quindi desidero passare le credenziali a tale server back-end in modo che può prendere appropriate decisioni di autorizzazione.

Quindi, per me è il primo passo per creare il token di delega (e spero, quindi, spero di capire cosa fare in merito alla classe HttpClient per fare il resto della chiamata). Ho questo:

//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); 

Ma, il problema è che SecurityTokenService è astratta. Non riesco a trovare alcun tipo derivato da questa classe né in System.IdentityModel né in System.IdentityModel.Services, e quanto sopra non include alcun riferimento al server ADFS che ovviamente dovrò fornire a un certo punto.

Naturalmente, potrei anche scendermi completamente lungo la strada sbagliata, o sto solo colpendo un ostacolo minore e non vedendo uno molto più grande che si profila in lontananza, quindi qualsiasi consiglio su ciò sarebbe apprezzato anche.


ho guardato, per esempio, Identity Delegation Scenario, ma che utilizza CreateChannelActingAs, che non credo che sta andando a lavorare quando sto parlando con un servizio di riposo (o sarà?), E inoltre non sembra applicabile a .NET 4.5.

risposta

3

Sto richiedendo token da un ADFS 2.0 per la memorizzazione nella cache e guardando il DisplayToken. Forse questo può aiutarti a iniziare.

Ecco quello che posso con:

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(); 
       } 
      } 
     } 
    } 

Potrebbe essere necessario acivate l'UsernameMixed Endpoint nelle ADFS 2.0, se si desidera usarlo e non dimenticate di riavviare il servizio dopo!

1

Da msdn

Per creare uno STS si deve derivare dalla classe SecurityTokenService. Nella classe personalizzata è necessario, come minimo, sovrascrivere i metodi GetScope e GetOutputClaimsIdentity.

+0

Non voglio implementare un servizio token di sicurezza: voglio parlare con quello di ADFS e ottenere il rilascio di un token di delega: non riesco a trovare un modo per farlo. –

1

Non sei sicuro di quanto questo ti sarà utile, ma non dovresti creare un SecurityTokenService. Non stai creando un nuovo token qui, e la tua aplication non dovrebbe agire come STS - questo è ciò per cui è ADFS.
l'applicazione deve delegare solo il token ricevuto dal AD FS al servizio (il concetto è descritto nel link da MSDN che hai fornito nella tua domanda)

Im indovinando theres una buona probabilità che l'API web sarà supponiamo anche questo, dato che è basato su wcf, e dal punto di vista http - non c'è motivo per cui non supporti un token ws-federation/saml 2.

EDIT:
This video (a partire dalle 35: 00 + -) mostra un modo, credo, per realizzare quello che stai cercando, con WS-Federation token SAML. immagino che sia possibile anche con un token saml2

+0

Ho capito che non voglio crearne uno da solo - ma voglio inviare una richiesta ad ADFS per il token di delega - Idealmente sto cercando qualcosa come 'var sts = new SomeStsObject (adfsEndpointAddress); var tokan = sts.Issue (rst); ', ma non lo abbiamo ancora trovato. –

+0

Non è come dovrebbe funzionare, se ho capito bene; Non devi inviare richieste di annunci per la delega. Dovresti autenticarti contro di esso e ricevere un token, come faresti in un flusso normale. Quindi, deleghi il token ricevuto al prossimo consumatore, supponendo che si fidi di esso. Non dovresti avere alcuna linea di codice che fa qualcosa come sts.Issue .. BTW, controlla [questo link] (http://leastprivilege.com/). Non ho letto tutto, ma sembra funzionare su problemi molto simili. – YavgenyP

+0

Quello che sto tentando è qualcosa come [Identity Delegation with ADFS 2.0] (http://technet.microsoft.com/en-us/library/adfs2-identity-delegation-step-by-step-guide (v = ws .10) .aspx), ma il mio servizio di back-end è REST, non WCF, quindi non posso usare 'CreateChannelActingAs', o una qualsiasi delle altre funzionalità di WCF. –