Comment convertir la chaîne de token SAML XML en instance principale SecurityToken ou claims?
Mon contexte:
- .Net service web RESTful
- Client (plates-formes mixtes, technologies, capacités lib) a obtenu un jeton SAML
- essayer d'accepter le token pour Authentification / autorisation dans le service REST
- dans L'en-tête HTTP Authorization / X-Authorization
- comme paramètre de requête
- supportera également SWT plus tard, mais il faut obtenir des tokens SAML va
Détails:
j'ai un jeton SAML dans une chaîne:
<saml:Assertion xmlns:saml="..." ...> ..etc... </>
dans un HttpModule, je veux le convertir en un claims Principalafin que mon service puisse faire le Thread habituel.CurrentPrincipal comme IClaimsPrincipal choses.
j'ai trouvé un couple pages/blogs/etc alléchants... qui a semblé utile:
- idée de Cibrax pour passer le token dans L'autorisation HTTP l'en-tête
- Dominick Baier sur quelque chose de semblable pour SWT, avec mention de facilement faire de même pour SAML
je suis littéralement coincé à essayer de transformer le jeton SAML en claims principal (via SecurityToken intermediate step ou direct... heureux de toute façon). Le code échantillon de L'idée de Cibrax utilise ce qui suit pour l'étape cruciale de vérification et de desérialisation:
SecurityTokenSerializer securityTokenSerializer
= new SecurityTokenSerializerAdapter(
FederatedAuthentication.SecurityTokenHandlers,
MessageSecurityVersion.Default.SecurityVersion,
false, new SamlSerializer(), null, null);
SecurityToken theToken
= WSFederationAuthenticationModule.GetSecurityToken(
theSamlTokenInStringForm, securityTokenSerializer);
Le mur, je l'ai frappé, c'est que la version RTM de WIF n'expose pas cette surcharge de GetSecurityToken... il expose que:
WSFederationAuthenticationModule fam = new WSFederationAuthenticationModule();
SecurityToken theToken = fam.GetSecurityToken(HttpRequest theRequest);
SecurityToken theToken = fam.GetSecurityToken(SignInResponseMessage message);
Merci de m'aider à débloquer!
Tyler
4 réponses
Juste trouvé cela utile. http://www.tecsupra.com/blog/system-identitymodel-manually-parsing-the-saml-token/
idée de base: vous avez besoin du XML du noeud"Audience" et ensuite vous pouvez utiliser la SecurityTokenHandlerCollection et utiliser "ValidateToken"
dans le post:
string samlTokenXml = signInResponseXml
.DocumentElement // <trust:RequestSecurityTokenResponseCollection>
.ChildNodes[0] // <trust:RequestSecurityTokenResponse>
.ChildNodes[2] // <trust:RequestedSecurityToken>
.InnerXml; // <Assertion>
var xmlTextReader = new XmlTextReader(new StringReader(samlTokenXml));
SecurityTokenHandlerCollection handlers =
FederatedAuthentication.FederationConfiguration.IdentityConfiguration.SecurityTokenHandlers;
// read the token
SecurityToken securityToken = handlers.ReadToken(xmlTextReader);
je veux partager quelques ressources que j'ai trouvées très utiles pour mettre en œuvre essentiellement le même scénario. Fondamentalement, Dominick Baier est un dieu dans cet espace. Son blog est plein de bonnes infos sur le sujet:
pour la conversion d'un jeton SAML / SWT En identité Iclaim dans une service:
pour résoudre la dernière exception, veuillez vérifier la balise et son contenu et assurez-vous qu'elle est correcte. Je ne peux pas dire quel élément a problème. Nous allons cette erreur quelques fois et à chaque fois la raison était la section de modèle d'identité malformée.
Ok, quelques progrès... si je ne les suivants, je les obtenir:
Microsoft.IdentityModel.Configuration.ServiceConfiguration serviceConfig
= new Microsoft.IdentityModel.Configuration.ServiceConfiguration();
// Now read the token and convert it to an IPrincipal
SecurityToken theToken = null;
ClaimsIdentityCollection claimsIdentity = null;
using (XmlReader reader = XmlReader.Create(new StringReader(authSamlString)))
{
theToken = serviceConfig.SecurityTokenHandlers.ReadToken(reader);
claimsIdentity = serviceConfig.SecurityTokenHandlers.ValidateToken(theToken);
}
IPrincipal principal = new ClaimsPrincipal(claimsIdentity);
Le mur suivant, j'ai frappé:
j'obtiens maintenant une exception dans l'allocation de l'hôte du service REST générée par l'Assistant ici:
<%@ ServiceHost Language="C#" Debug="true" Service="Sample.RestService.Service" Factory="Sample.RestService.AppServiceHostFactory"%>
using System;
using System.ServiceModel;
using System.ServiceModel.Activation;
using Microsoft.ServiceModel.Web.SpecializedServices;
namespace Sample.RestService
{
class AppServiceHostFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
/// ***** The exception occurs on the next line *****
return new SingletonServiceHost(serviceType, baseAddresses);
}
}
}
les détails de L'exception:
System.Configuration.ConfigurationErrorsException occurred
Message="This element is not currently associated with any context"
Source="System.Configuration"
BareMessage="This element is not currently associated with any context"
Line=0
StackTrace:
at System.Configuration.ConfigurationElement.get_EvaluationContext()
InnerException: {{NONE}}