2015-04-12 4 views
2

Nos points de terminaison webapi sont utilisés pour les clients basés sur un navigateur (angulaire) et les clients sans navigateur (restsharp) et les webapi sont actuellement sécurisés en utilisant WS-Federation passive comme le protocole et ADFS comme le STS. Nous utilisons actuellement une solution de contournement relativement compliquée pour les clients restsharp car WS-Federation passive n'est pas optimale pour les clients non navigateurs. Nous aimerions donc trouver un meilleur moyen de sécuriser nos points de terminaison webapi pour ces types de clients sans avoir à remplacer ADFS ou ajouter une infrastructure supplémentaire. Ma compréhension est que OAuth2 "octroi de références de mot de passe du propriétaire de ressources" (grant_type = mot de passe) prendrait en charge ce scénario bien, mais malheureusement, il n'est pas actuellement pris en charge par ADFS. Donc, ma question est la suivante: existe-t-il un bon moyen d'utiliser le flux OAuth2 pris en charge par ADFS, à savoir le "Grantization Grant Grant" (grant_type = code_autorisation) pour prendre en charge les clients sans navigateur?Quel protocole utiliser avec ADFS pour les clients non-navigateurs

Si ce n'est pas possible, puis-je sécuriser des points de terminaison WebApi à l'aide de jetons WS-Trust et de support sans avoir recours à WCF?

Répondre

3

Il s'avère qu'il était possible d'utiliser WS-Trust pour obtenir un jeton saml 2.0 et un WebApi pour le consommer avec un peu d'aide de Thinktecture IdentityModel. Ce qui suit n'inclut pas la transformation des revendications, donc si vous devez ajouter des revendications au principal, un peu plus de travail est nécessaire.

Le démarrage owin pour le service WebAPI doit utiliser les éléments suivants de Thinktecture.IdentityModel.Owin:

app.UseSaml2BearerAuthentication(
      audience: new Uri(ConfigurationManager.AppSettings["FederatedSecurity.Realm"]), 
      issuerThumbprint: ConfigurationManager.AppSettings["FederatedSecurity.Thumbprint"], 
      issuerName: ConfigurationManager.AppSettings["FederatedSecurity.Authority"]); 

Pour le client de demander le jeton SAML 2.0 de ADFS

private static SecurityToken RequestSecurityToken() 
{ 
    var trustChannelFactory = new WSTrustChannelFactory(new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), new EndpointAddress(new Uri("https://yourAdfsServer/adfs/services/trust/13/usernamemixed"), new AddressHeader[0])) 
    { 
     TrustVersion = TrustVersion.WSTrust13, 
     Credentials = { UserName = { UserName = @"[email protected]", Password = "[email protected]" } } 
    }; 
    var requestSecurityToken = new RequestSecurityToken 
    { 
     RequestType = RequestTypes.Issue, 
     KeyType = KeyTypes.Bearer, 
     TokenType = TokenTypes.Saml2TokenProfile11, 
     AppliesTo = new EndpointReference(_audience) 
    }; 

    RequestSecurityTokenResponse response; 
    var securityToken = trustChannelFactory.CreateChannel().Issue(requestSecurityToken, out response); 

    return securityToken; 
} 

Et pour le client pour appeler le service (en utilisant HttpClient mais RestSharp fonctionnera également)

private static void CallService(SecurityToken token) 
{ 
    using (HttpClient client = new HttpClient()) 
    { 
     client.SetBearerToken(Convert.ToBase64String(Encoding.UTF8.GetBytes(token.ToTokenXmlString()))); 
     var httpMessage = client.GetAsync(new Uri(_restEndpoint)).Result; 
    } 
}