2017-07-28 4 views
1

Il existe un question about using SAML in ASP.Net Core, mais j'ai besoin d'aide supplémentaire. La seule réponse à cette question est Kentor.AuthServices, mais je ne comprends pas comment l'utiliser. Tout ce que je trouve sur cette bibliothèque ou sur d'autres bibliothèques SAML, la documentation, les articles de blog et les exemples d'applications sont tous destinés à contacter un service d'authentification externe et à gérer le login et la déconnexion.ASP.Net Core - Transforme l'assertion SAML en ClaimsPrincipal

Mais je n'ai pas besoin de ça. La configuration avec laquelle je travaille fait cela dans une application de pare-feu orientée vers les bords, et les demandes de connexion/déconnexion ne parviennent jamais à mon application. Tout ce que je reçois est un jeton SAML dans un cookie, que j'ai besoin de valider et de transformer en ClaimsPrincipal. Je ne peux pas (la configuration du réseau de déploiement est incroyablement paranoïaque) et je ne veux pas contacter un fournisseur d'identité.

Actuellement, j'ai écrit un morceau de middleware qui prend le cookie, l'analyse et analyse les parties dont j'ai besoin pour le principe des revendications. Mais je ne fais aucune validation, que ce soit de la signature XML ou de la validité SAML (attributs de temps valides, etc.). Avec .Net Core 2.0 Preview 2 Je peux faire la validation de la signature XML, mais je suis toujours bloqué sur la validation SAML. Y at-il une bibliothèque qui valide simplement les contraintes SAML et ne fait rien d'autre (ou, au moins, où je peux ignorer tout le reste)? Je crois que Kentor ou ITfoxtec ou SAML2.Core d'elerch doivent contenir une telle fonctionnalité, mais je ne peux pas comprendre où c'est.

Répondre

1

Je l'ai fait avec la classe SecurityTokenHandlerCollection dans System.IdentityModel.Tokens J'espère que ce code va vous aider.

public Saml2SecurityToken DeserializeSAMLResponse(string samlResponse) 
    { 
     //Deserializing saml response 

     Saml2SecurityToken token; 
     using (var reader = XmlReader.Create(new StringReader(samlResponse))) 
     { 
      reader.ReadToFollowing("Assertion", Infrastructure.Enumerations.StringEnum.GetStringValue(SAMLProtocoles.SAML_20_ASSERTION)); 
      // Deserialize the token so that data can be taken from it and plugged into the RSTR 
      SecurityTokenHandlerCollection tokenHandlerCollection = SecurityTokenHandlerCollection.CreateDefaultSecurityTokenHandlerCollection(); 
      token = (Saml2SecurityToken)tokenHandlerCollection.ReadToken(reader.ReadSubtree()); 
     } 

     //Deserializing successful 
     return token; 
    } 

Il validera en interne le SAML et l'analyser dans Saml2SecurityToken Une fois que vous obtenez le jeton, vous pouvez les les utilisateurs de vérification des pouvoirs comme celui-ci

public User ReadSamlResponse(string samlResponse, string profileName, bool isSAMLProfile = true) 
    { 
     User User = new User(); 
     var DecodedSamlResponse = Convert.FromBase64String(samlResponse); 
     string ResponseDecoded = coding.UTF8.GetString(DecodedSamlResponse); 

      Saml2SecurityToken Token = _samlAuthenticationService.DeserializeSAMLResponse(ResponseDecoded); 
      if()// apply condition here if you need to validate signature 
      { 
       if (!_samlAuthenticationService.ValidateSamlToken(ResponseDecoded, AuthenticationConnector, isSAMLProfile)) 
        throw new Exception("Signature is invalid"); 
      } 

      User = GetUserFromToken(Token); 
      return User; 
     } 

Et pour obtenir l'utilisateur pour jeton de sécurité, vous pouvez le faire

public User GetUserFromToken(Saml2SecurityToken Token) 
    { 
     //Get user information from the token started 
     User User = new User(); 
     if (Token != null) 
     { 
      if (Token.Assertion.Subject.NameId != null && (Token.Assertion.Subject.NameId.Format == null || Token.Assertion.Subject.NameId.Format.OriginalString == "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress")) 
       User.EmailAddress = Token.Assertion.Subject.NameId.Value; 
      foreach (var Statement in Token.Assertion.Statements) 
      { 
       var AttributeStatement = Statement as Saml2AttributeStatement; 
       var AuthenticationStatement = Statement as Saml2AuthenticationStatement; 
       if (AttributeStatement != null) 
        foreach (var Saml2Attribute in AttributeStatement.Attributes) 
        { 
         if (Saml2Attribute.Name.Equals("mail") || Saml2Attribute.Name.Equals("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress")) 
          User.EmailAddress = Saml2Attribute.Values[0]; 
         if (Saml2Attribute.Name.Equals("uid") || Saml2Attribute.Name.Equals("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name")) 
          User.Name = Saml2Attribute.Values[0]; 
         if (Saml2Attribute.Name.Equals("phone")) 
          User.MobileNumber = Saml2Attribute.Values[0]; 
         if (Saml2Attribute.Name.Equals("title")) 
          User.JobTitle = Saml2Attribute.Values[0]; 
         if (Saml2Attribute.Name.Equals("company")) 
          User.CompanyName = Saml2Attribute.Values[0]; 
        } 
       if (AuthenticationStatement != null) 
       { 
        User.SAMLSessionIndex = AuthenticationStatement.SessionIndex; 
       } 
      } 
     } 
     //Successfully parsed user credentials 
     return User; 
    }