2012-03-26 10 views
5

Potrzebuję utworzyć token SAML z niestandardowymi danymi.Tworzenie własnego tokena SAML

Jest to dobry przykład patrząc na MSDN ale to nie kompilacji ....

Czy ktoś dostał SMT czytać o niej próbki działa?

Lub po prostu dodaje nowe roszczenia do kolekcji Asercja? Czy muszę je opisywać w federationmetadata? Jakie inne problemy powinienem zrobić? Chętnie skorzystam z pomocy.

Odpowiedz

12

Pamiętam, że istnieje pewien niestandardowy kod generujący token SAML w jednym z przykładów ACS. To byłoby dobre miejsce na rozpoczęcie. Możesz pobrać go pod numer here, poszukaj parametru OAuth2CertificateSample, SelfSignedSaml2TokenGenerator.cs. Kod wygląda następująco:

/// <summary> 
/// Creates a SAML assertion signed with the given certificate. 
/// </summary> 
public static Saml2SecurityToken GetSamlAssertionSignedWithCertificate(String nameIdentifierClaim, byte[] certificateWithPrivateKeyRawBytes, string password) 
{ 
    string acsUrl = string.Format(CultureInfo.InvariantCulture, "https://{0}.{1}", SamplesConfiguration.ServiceNamespace, SamplesConfiguration.AcsHostUrl); 

    Saml2Assertion assertion = new Saml2Assertion(new Saml2NameIdentifier(nameIdentifierClaim)); 

    Saml2Conditions conditions = new Saml2Conditions(); 
    conditions.NotBefore = DateTime.UtcNow; 
    conditions.NotOnOrAfter = DateTime.MaxValue; 
    conditions.AudienceRestrictions.Add(new Saml2AudienceRestriction(new Uri(acsUrl, UriKind.RelativeOrAbsolute))); 
    assertion.Conditions = conditions; 

    Saml2Subject subject = new Saml2Subject(); 
    subject.SubjectConfirmations.Add(new Saml2SubjectConfirmation(Saml2Constants.ConfirmationMethods.Bearer)); 
    subject.NameId = new Saml2NameIdentifier(nameIdentifierClaim); 
    assertion.Subject = subject; 

    X509SigningCredentials clientSigningCredentials = new X509SigningCredentials(
      new X509Certificate2(certificateWithPrivateKeyRawBytes, password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable)); 

    assertion.SigningCredentials = clientSigningCredentials; 

    return new Saml2SecurityToken(assertion); 
} 

Ponadto, proces uwierzytelniania nie wymaga wydane roszczenia należy opisać w metadanych federacji. Roszczenia publikowane w metadanych federacji są jedynie wskazówką dla konsumenta tokena, co powinni oczekiwać w wydanym tokenie.

+0

Dzięki za interesujące rozwiązanie! –

+0

Tak jak myślałem, jedynym problemem, jaki miałem w moim kodzie, było zapomnienie o ustawieniu danych logowania. Świetny Snippit. Dużo miłości. – Eon

+0

Nowa lokalizacja pobierania ACS: https://code.msdn.microsoft.com/Windows-Azure-AD-Access-0dcde385 – fiat