2012-05-29 33 views
8

Estoy intentando crear un sistema que trabaje con ADFS y notificaciones. Por el momento, esto es solo una implementación de "juguete".Crear token de delegación: no se puede crear un SecurityTokenService

He creado una aplicación web MVC muy simple, la configuré utilizando el asistente "Identity and Access ..." en Visual Studio para hablar con un servidor ADFS 2.0 y la implementé en un servidor IIS. Todo funciona bien, y puedo examinar y enumerar las reclamaciones recibidas.

El siguiente paso es crear un servicio REST basado en API web (que represente servicios de back-end de los que la aplicación MVC va a depender), por lo que quiero pasar las credenciales a ese servidor de fondo para que puede tomar decisiones de autorización adecuadas.

Así que el primer paso es para mí crear el token de delegación (y luego, con suerte, averiguaré qué hacer con él en términos de la clase HttpClient para hacer la llamada de reposo). Tengo esto:

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

embargo, la cuestión es que SecurityTokenService es abstracto. No puedo encontrar ningún tipo derivado de esta clase en System.IdentityModel ni System.IdentityModel.Services, y lo anterior no incluye ninguna referencia al servidor ADFS que obviamente tendré que proporcionar en algún momento.

Por supuesto, también puedo estar tomando una ruta equivocada, o simplemente estoy golpeando un obstáculo menor y no viendo uno mucho más grande en la distancia, así que cualquier consejo sobre eso sería apreciado también.


He mirado en, por ejemplo, Identity Delegation Scenario, pero que utiliza CreateChannelActingAs, que no creo que se va a trabajar cuando estoy hablando a un servicio de descanso (o lo hará?), Y tampoco parece aplicarse a .NET 4.5.

Respuesta

3

Estoy solicitando tokens desde un ADFS 2.0 para el almacenamiento en caché y mirando el DisplayToken. Quizás esto puede ayudarte a comenzar.

Esto es lo que puede hasta 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(); 
       } 
      } 
     } 
    } 

Puede que tenga que acivate la UsernameMixed punto final en sus AD FS 2.0 si desea usarlo y no se olvide de reiniciar el servicio después!

1

De msdn

para crear un STS debe derivar de la clase SecurityTokenService. En su clase personalizada, debe, como mínimo, anular los métodos GetScope y GetOutputClaimsIdentity.

+0

No quiero implementar un STS - Quiero hablar con el ADFS y obtener un token de delegación - Parece que no puedo encontrar una manera de hacerlo. –

1

No estoy seguro de cuánto le ayudará esto, pero se supone que no debe crear un SecurityTokenService. No está creando un token nuevo aquí, y se supone que su aplicación no debe actuar como el STS: para eso es el AD FS.
Su aplicación sólo debe delegar el token recibido de la AD FS para el servicio (el concepto se describe en el enlace desde MSDN que ya ha proporcionado en su pregunta)

Im adivinar theres una buena oportunidad el API web se apoye esto también, como se basa en wcf, y desde el punto de vista de http - no hay ninguna razón por la que no sea compatible con un ws-federation/saml 2 tokens.

EDIT:
This de vídeo (a partir de las 35: 00 + -) muestra una forma, creo que, para poner en práctica lo que usted está buscando, con WS-Federation token de SAML. estoy adivinando también es posible con un token saml2

+0

Creo que no quiero crear uno yo mismo, pero quiero enviar una solicitud a ADFS para el token de delegación. Idealmente, estoy buscando algo como 'var sts = new SomeStsObject (adfsEndpointAddress); var tokan = sts.Issue (rst); ', pero aún no se ha encontrado. –

+0

Eso no es cómo se suponía que iba a funcionar, si lo entiendo correctamente; Se supone que no debes enviar solicitudes de anuncios para la delegación. Se supone que debes autenticarte y recibir un token, como lo harías con un flujo normal. Luego, delegue la ficha recibida al próximo consumidor, suponiendo que confíe en ella. No se supone que tengas ninguna línea de código haciendo algo como pts. De acuerdo ... Por cierto, mira [este enlace] (http://leastprivilege.com/). No lo leí todo, pero parece que trabaja en temas muy similares. – YavgenyP

+0

Lo que intento es algo así como [Delegación de identidad con ADFS 2.0] (http://technet.microsoft.com/en-us/library/adfs2-identity-delegation-step-by-step-guide (v = ws) .10) .aspx), pero mi servicio de fondo es REST, no WCF, por lo que no puedo usar 'CreateChannelActingAs', ni ninguna de las otras características de WCF. –

Cuestiones relacionadas