2017-07-28 3 views
1

Es gibt eine question about using SAML in ASP.Net Core, aber ich brauche zusätzliche Hilfe.ASP.Net Core - Verwandle SAML Assertion in ClaimsPrincipal

Die einzige Antwort dort erwähnt Kentor.AuthServices, aber ich verstehe nicht, wie man es benutzt. Alles, was ich in dieser oder anderen SAML-Bibliotheken, der Dokumentation, den Blog-Posts und den Beispielanwendungen finde, dreht sich alles darum, einige externe Authentifizierungsdienste zu kontaktieren und die An- und Abmeldung durchzuführen.

Aber ich brauche nichts davon. Das Setup, mit dem ich arbeite, funktioniert in einer kantenorientierten Firewall-Anwendung, und Anmelde-/Abmeldungsanfragen erreichen meine Anwendung nie. Alles, was ich bekomme, ist ein SAML-Token in einem Cookie, den ich validieren und in ein ClaimsPrincipal verwandeln muss. Ich kann nicht (das Setup des Bereitstellungsnetzwerkes ist wahnsinnig paranoid) und möchte keinen Identitätsanbieter kontaktieren.

Momentan habe ich ein Stück Middleware geschrieben, das den Cookie aufnimmt, analysiert und die Teile analysiert, die ich für den Claims Principal benötige. Ich überprüfe aber weder die XML-Signatur noch die SAML-Gültigkeit (gültige Zeitattribute etc.). Mit .Net Core 2.0 Preview 2 kann ich die Validierung der XML-Signatur durchführen, bin aber immer noch dabei, die SAML-Validierung durchzuführen. Gibt es eine Bibliothek, die SAML-Einschränkungen einfach validiert und nichts anderes tut (oder zumindest wo ich alles andere ignorieren kann)? Ich glaube, Kentor oder ITfoxtec oder elerchs SAML2.Core muss solche Funktionalität enthalten, aber ich kann nicht herausfinden, wo es ist.

Antwort

1

Ich habe dies mit SecurityTokenHandlerCollection-Klasse in System.IdentityModel.Tokens Ich hoffe, dieser Code wird Ihnen helfen.

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

Es wird intern validieren die SAML und analysieren es in Saml2SecurityToken Nachdem Sie das Token erhalten können Sie die die Benutzer-Anmeldeinformationen wie folgt

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

und einen Benutzer für Sicherheits-Token erhalten können Sie dies tun

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; 
    } 
Verwandte Themen