Delen via


Federatie

In dit onderwerp vindt u een kort overzicht van het concept van federatieve beveiliging. Het beschrijft ook WCF-ondersteuning (Windows Communication Foundation) voor het implementeren van federatieve beveiligingsarchitecturen. Zie Federatievoorbeeld voor een voorbeeldtoepassing die federatie demonstreert.

Definitie van federatieve beveiliging

Federatieve beveiliging zorgt voor een schone scheiding tussen de service die een client opent en de bijbehorende verificatie- en autorisatieprocedures. Federatieve beveiliging maakt ook samenwerking mogelijk tussen meerdere systemen, netwerken en organisaties in verschillende vertrouwensdomeinen.

WCF biedt ondersteuning voor het bouwen en implementeren van gedistribueerde systemen die gebruikmaken van federatieve beveiliging.

Elementen van een federatieve beveiligingsarchitectuur

De federatieve beveiligingsarchitectuur heeft drie belangrijke elementen, zoals beschreven in de volgende tabel.

Element Beschrijving
Domein/realm Eén eenheid van beveiligingsbeheer of vertrouwensrelatie. Een typisch domein kan één organisatie bevatten.
Federatie Een verzameling domeinen die een vertrouwensrelatie hebben ingesteld. Het niveau van de vertrouwensrelatie kan verschillen, maar omvat gewoonlijk verificatie en bijna altijd autorisatie. Een typische federatie kan een aantal organisaties omvatten waarmee een vertrouwensrelatie is ingesteld voor gedeelde toegang tot een reeks resources.
Beveiligingstokenservice (STS) Een webservice die beveiligingstokens uitgeeft; Dat wil zeggen, het doet beweringen op basis van bewijs dat het vertrouwt, aan wie het vertrouwt. Dit vormt de basis van vertrouwensbrokering tussen domeinen.

Voorbeeldscenario

In de volgende afbeelding ziet u een voorbeeld van federatieve beveiliging:

Diagram showing a typical federated security scenario.

Dit scenario omvat twee organisaties: A en B. Organisatie B heeft een webresource (een webservice) die sommige gebruikers in organisatie A waardevol vinden.

Notitie

In deze sectie worden de termen resource, service en webservice door elkaar gebruikt.

Normaal gesproken vereist organisatie B dat een gebruiker van organisatie A een geldige vorm van verificatie biedt voordat de service wordt geopend. Daarnaast kan de organisatie ook vereisen dat de gebruiker gemachtigd is om toegang te krijgen tot de betreffende resource. Een manier om dit probleem op te lossen en gebruikers in organisatie A toegang te geven tot de resource in organisatie B is als volgt:

  • Gebruikers van organisatie A registreren hun referenties (een gebruikersnaam en wachtwoord) bij organisatie B.

  • Tijdens de toegang tot resources presenteren gebruikers van organisatie A hun referenties aan organisatie B en worden geverifieerd voordat ze toegang krijgen tot de resource.

Deze aanpak heeft drie belangrijke nadelen:

  • Organisatie B moet de referenties voor gebruikers van organisatie A beheren, naast het beheren van de referenties van de lokale gebruikers.

  • Gebruikers in de organisatie A moeten een extra set referenties onderhouden (dat wil gezegd een extra gebruikersnaam en wachtwoord onthouden) afgezien van de referenties die ze normaal gesproken gebruiken om toegang te krijgen tot resources binnen organisatie A. Dit moedigt meestal aan om dezelfde gebruikersnaam en hetzelfde wachtwoord te gebruiken op meerdere servicesites, wat een zwakke beveiligingsmaatregel is.

  • De architectuur schaalt niet naarmate meer organisaties de resource in organisatie B als waarde ervaren.

Een alternatieve aanpak, die de eerder genoemde nadelen aanpakt, is het gebruik van federatieve beveiliging. In deze benadering stellen organisaties A en B een vertrouwensrelatie tot stand en maken ze gebruik van StS (Security Token Service) om brokering van de gevestigde vertrouwensrelatie mogelijk te maken.

In een federatieve beveiligingsarchitectuur weten gebruikers van organisatie A dat als ze toegang willen hebben tot de webservice in organisatie B, dat ze een geldig beveiligingstoken moeten presenteren van de STS bij organisatie B, die hun toegang tot de specifieke service verifieert en autoriseert.

Bij het contact opnemen met STS B ontvangen de gebruikers een ander niveau van indirectie van het beleid dat is gekoppeld aan de STS. Ze moeten een geldig beveiligingstoken van de STS A (dat wil gezegd de clientvertrouwensrealm) presenteren voordat de STS B een beveiligingstoken kan uitgeven. Dit is een samentrekking van de vertrouwensrelatie tussen de twee organisaties en impliceert dat organisatie B geen identiteiten hoeft te beheren voor gebruikers van organisatie A. In de praktijk heeft STS B doorgaans een null issuerAddress en issuerMetadataAddress. Zie Instructies voor meer informatie : Een lokale verlener configureren. In dat geval raadpleegt de client een lokaal beleid om STS A te vinden. Deze configuratie wordt thuisrealmfederatie genoemd en wordt beter geschaald omdat STS B geen informatie over STS A hoeft te onderhouden.

De gebruikers neemt vervolgens contact op met de STS bij organisatie A en verkrijgt een beveiligingstoken door verificatiereferenties te presenteren die ze normaal gesproken gebruiken om toegang te krijgen tot andere resources binnen organisatie A. Dit vermindert ook het probleem dat gebruikers meerdere sets referenties moeten onderhouden of dezelfde set referenties op meerdere servicesites moeten gebruiken.

Zodra de gebruikers een beveiligingstoken van STS A hebben verkregen, presenteren ze het token aan de STS B. Organisatie B gaat door met het uitvoeren van autorisatie van de aanvragen van de gebruikers en geeft een beveiligingstoken uit aan de gebruikers vanuit een eigen set beveiligingstokens. De gebruikers kunnen vervolgens hun token presenteren aan de resource in organisatie B en toegang krijgen tot de service.

Ondersteuning voor federatieve beveiliging in WCF

WCF biedt kant-en-klare ondersteuning voor het implementeren van federatieve beveiligingsarchitecturen via wsFederationHttpBinding><.

Het <element wsFederationHttpBinding> biedt een veilige, betrouwbare, interoperabele binding die het gebruik van HTTP als het onderliggende transportmechanisme voor de communicatiestijl request-reply omvat, waarbij tekst en XML worden gebruikt als draadindeling voor codering.

Het gebruik van <wsFederationHttpBinding> in een federatief beveiligingsscenario kan worden losgekoppeld in twee logisch onafhankelijke fasen, zoals beschreven in de volgende secties.

Fase 1: Ontwerpfase

Tijdens de ontwerpfase gebruikt de client het Hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) om het beleid te lezen dat het service-eindpunt beschikbaar maakt en om de verificatie- en autorisatievereisten van de service te verzamelen. De juiste proxy's worden samengesteld om het volgende federatieve beveiligingscommunicatiepatroon op de client te maken:

  • Haal een beveiligingstoken op van de STS in het clientvertrouwensdomein.

  • Presenteer het token aan de STS in het servicevertrouwensdomein.

  • Haal een beveiligingstoken op van de STS in het servicevertrouwensdomein.

  • Presenteer het token aan de service om toegang te krijgen tot de service.

Fase 2: Runtimefase

Tijdens de runtimefase maakt de client een instantie van een object van de WCF-clientklasse en voert deze een aanroep uit met behulp van de WCF-client. Het onderliggende framework van WCF verwerkt de eerder genoemde stappen in het federatieve beveiligingscommunicatiepatroon en stelt de client in staat de service naadloos te gebruiken.

Voorbeeld van implementatie met WCF

In de volgende afbeelding ziet u een voorbeeld van een implementatie voor een federatieve beveiligingsarchitectuur met behulp van systeemeigen ondersteuning van WCF.

Diagram showing a sample Federation security implementation.

Voorbeeld van MyService

De service MyService maakt één eindpunt beschikbaar via MyServiceEndpoint. In de volgende afbeelding ziet u het adres, de binding en het contract dat aan het eindpunt is gekoppeld.

Diagram showing the MyServiceEndpoint details.

Het service-eindpunt MyServiceEndpoint maakt gebruik van het <wsFederationHttpBinding> en vereist een geldig SAML-token (Security Assertions Markup Language) met een accessAuthorized claim die is uitgegeven door STS B. Dit wordt declaratief opgegeven in de serviceconfiguratie.

<system.serviceModel>  
  <services>  
    <service type="FederationSample.MyService"
        behaviorConfiguration='MyServiceBehavior'>  
        <endpoint address=""  
            binding=" wsFederationHttpBinding"  
            bindingConfiguration='MyServiceBinding'  
            contract="Federation.IMyService" />  
   </service>  
  </services>  
  
  <bindings>  
    <wsFederationHttpBinding>  
    <!-- This is the binding used by MyService. It redirects   
    clients to STS-B. -->  
      <binding name='MyServiceBinding'>  
        <security mode="Message">  
           <message issuedTokenType=  
"http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1">  
           <issuer address="http://localhost/FederationSample/STS-B/STS.svc" />  
            <issuerMetadata
           address=  
"http://localhost/FederationSample/STS-B/STS.svc/mex" />  
         <requiredClaimTypes>  
            <add claimType="http://tempuri.org:accessAuthorized" />  
         </requiredClaimTypes>  
        </message>  
      </security>  
      </binding>  
    </wsFederationHttpBinding>  
  </bindings>  
  
  <behaviors>  
    <behavior name='MyServiceBehavior'>  
      <serviceAuthorization
operationRequirementType="FederationSample.MyServiceOperationRequirement, MyService" />  
       <serviceCredentials>  
         <serviceCertificate findValue="CN=FederationSample.com"  
         x509FindType="FindBySubjectDistinguishedName"  
         storeLocation='LocalMachine'  
         storeName='My' />  
      </serviceCredentials>  
    </behavior>  
  </behaviors>  
</system.serviceModel>  

Notitie

Er moet een subtiel punt worden genoteerd over de claims die vereist zijn voor MyService. De tweede afbeelding geeft aan dat MyService een SAML-token met de accessAuthorized claim is vereist. Om nauwkeuriger te zijn, geeft dit het claimtype op dat MyService vereist is. De volledig gekwalificeerde naam van dit claimtype is http://tempuri.org:accessAuthorized (samen met de bijbehorende naamruimte), die wordt gebruikt in het serviceconfiguratiebestand. De waarde van deze claim geeft de aanwezigheid van deze claim aan en wordt ervan uitgegaan dat deze wordt ingesteld true door STS B.

Tijdens runtime wordt dit beleid afgedwongen door de MyServiceOperationRequirement klasse die wordt geïmplementeerd als onderdeel van de MyService.

using System.Collections.Generic;
using System.IdentityModel.Claims;
using System.IdentityModel.Policy;
using System.IdentityModel.Tokens;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel;
Imports System.Collections.Generic
Imports System.IdentityModel.Claims
Imports System.IdentityModel.Policy
Imports System.IdentityModel.Tokens
Imports System.Security.Cryptography.X509Certificates
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports System.ServiceModel.Security.Tokens
Imports System.Text
public class myServiceAuthorizationManager : ServiceAuthorizationManager
{
    // Override the CheckAccess method to enforce access control requirements.
    public override bool CheckAccess(OperationContext operationContext)
    {
        AuthorizationContext authContext =
        operationContext.ServiceSecurityContext.AuthorizationContext;
        if (authContext.ClaimSets == null) return false;
        if (authContext.ClaimSets.Count != 1) return false;
        ClaimSet myClaimSet = authContext.ClaimSets[0];
        if (!IssuedBySTS_B(myClaimSet)) return false;
        if (myClaimSet.Count != 1) return false;
        Claim myClaim = myClaimSet[0];
        if (myClaim.ClaimType ==
          "http://www.tmpuri.org:accessAuthorized")
        {
            string resource = myClaim.Resource as string;
            if (resource == null) return false;
            if (resource != "true") return false;
            return true;
        }
        else
        {
            return false;
        }
    }

    // This helper method checks whether SAML Token was issued by STS-B.
    // It compares the Thumbprint Claim of the Issuer against the
    // Certificate of STS-B.
    private bool IssuedBySTS_B(ClaimSet myClaimSet)
    {
        ClaimSet issuerClaimSet = myClaimSet.Issuer;
        if (issuerClaimSet == null) return false;
        if (issuerClaimSet.Count != 1) return false;
        Claim issuerClaim = issuerClaimSet[0];
        if (issuerClaim.ClaimType != ClaimTypes.Thumbprint)
            return false;
        if (issuerClaim.Resource == null) return false;
        byte[] claimThumbprint = (byte[])issuerClaim.Resource;
        // It is assumed that stsB_Certificate is a variable of type
        // X509Certificate2 that is initialized with the Certificate of
        // STS-B.
        X509Certificate2 stsB_Certificate = GetStsBCertificate();
        byte[] certThumbprint = stsB_Certificate.GetCertHash();
        if (claimThumbprint.Length != certThumbprint.Length)
            return false;
        for (int i = 0; i < claimThumbprint.Length; i++)
        {
            if (claimThumbprint[i] != certThumbprint[i]) return false;
        }
        return true;
    }
Public Class myServiceAuthorizationManager
    Inherits ServiceAuthorizationManager

    ' Override the CheckAccess method to enforce access control requirements.
    Public Overloads Overrides Function CheckAccess(ByVal operationContext As OperationContext) As Boolean
        Dim authContext = operationContext.ServiceSecurityContext.AuthorizationContext
        If authContext.ClaimSets Is Nothing Then
            Return False
        End If

        If authContext.ClaimSets.Count <> 1 Then
            Return False
        End If

        Dim myClaimSet = authContext.ClaimSets(0)
        If Not IssuedBySTS_B(myClaimSet) Then
            Return False
        End If
        If myClaimSet.Count <> 1 Then
            Return False
        End If
        Dim myClaim = myClaimSet(0)
        If myClaim.ClaimType = "http://www.tmpuri.org:accessAuthorized" Then
            Dim resource = TryCast(myClaim.Resource, String)
            If resource Is Nothing Then
                Return False
            End If
            If resource <> "true" Then
                Return False
            End If
            Return True
        Else
            Return False
        End If
    End Function

    ' This helper method checks whether SAML Token was issued by STS-B.     
    ' It compares the Thumbprint Claim of the Issuer against the 
    ' Certificate of STS-B. 
    Private Function IssuedBySTS_B(ByVal myClaimSet As ClaimSet) As Boolean
        Dim issuerClaimSet = myClaimSet.Issuer
        If issuerClaimSet Is Nothing Then
            Return False
        End If
        If issuerClaimSet.Count <> 1 Then
            Return False
        End If
        Dim issuerClaim = issuerClaimSet(0)
        If issuerClaim.ClaimType <> ClaimTypes.Thumbprint Then
            Return False
        End If
        If issuerClaim.Resource Is Nothing Then
            Return False
        End If
        Dim claimThumbprint() = CType(issuerClaim.Resource, Byte())
        ' It is assumed that stsB_Certificate is a variable of type 
        ' X509Certificate2 that is initialized with the Certificate of 
        ' STS-B.
        Dim stsB_Certificate = GetStsBCertificate()
        Dim certThumbprint() = stsB_Certificate.GetCertHash()
        If claimThumbprint.Length <> certThumbprint.Length Then
            Return False
        End If
        For i = 0 To claimThumbprint.Length - 1
            If claimThumbprint(i) <> certThumbprint(i) Then
                Return False
            End If
        Next i
        Return True
    End Function

STS B

In de volgende afbeelding ziet u de STS B. Zoals eerder vermeld, is een beveiligingstokenservice (STS) ook een webservice en kan de bijbehorende eindpunten, het beleid enzovoort hebben.

Diagram showing security token service B.

STS B maakt één eindpunt beschikbaar, dat kan STSEndpoint worden gebruikt om beveiligingstokens aan te vragen. Met name STS B geeft SAML-tokens uit met de accessAuthorized claim, die kan worden weergegeven op de MyService servicesite voor toegang tot de service. STS B vereist echter dat gebruikers een geldig SAML-token presenteren dat is uitgegeven door STS A die de userAuthenticated claim bevat. Dit wordt declaratief opgegeven in de STS-configuratie.

<system.serviceModel>  
  <services>  
    <service type="FederationSample.STS_B" behaviorConfiguration=  
     "STS-B_Behavior">  
    <endpoint address=""  
              binding="wsFederationHttpBinding"  
              bindingConfiguration='STS-B_Binding'  
      contract="FederationSample.ISts" />  
    </service>  
  </services>  
  <bindings>  
    <wsFederationHttpBinding>  
    <!-- This is the binding used by STS-B. It redirects clients to   
         STS-A. -->  
      <binding name='STS-B_Binding'>  
        <security mode='Message'>  
          <message issuedTokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1">  
          <issuer address='http://localhost/FederationSample/STS-A/STS.svc' />  
          <issuerMetadata address='http://localhost/FederationSample/STS-A/STS.svc/mex'/>  
          <requiredClaimTypes>  
            <add claimType='http://tempuri.org:userAuthenticated'/>  
          </requiredClaimTypes>  
          </message>  
        </security>  
    </binding>  
   </wsFederationHttpBinding>  
  </bindings>  
  <behaviors>  
  <behavior name='STS-B_Behavior'>  
    <serviceAuthorization   operationRequirementType='FederationSample.STS_B_OperationRequirement, STS_B' />  
    <serviceCredentials>  
      <serviceCertificate findValue='CN=FederationSample.com'  
      x509FindType='FindBySubjectDistinguishedName'  
       storeLocation='LocalMachine'  
       storeName='My' />  
     </serviceCredentials>  
   </behavior>  
  </behaviors>  
</system.serviceModel>  

Notitie

Opnieuw is de userAuthenticated claim het claimtype dat is vereist voor STS B. De volledig gekwalificeerde naam van dit claimtype is http://tempuri.org:userAuthenticated (samen met de bijbehorende naamruimte), die wordt gebruikt in het STS-configuratiebestand. De waarde van deze claim geeft de aanwezigheid van deze claim aan en wordt ervan uitgegaan dat deze wordt ingesteld true door STS A.

Tijdens runtime dwingt de STS_B_OperationRequirement klasse dit beleid af, dat wordt geïmplementeerd als onderdeel van STS B.

public class STS_B_AuthorizationManager : ServiceAuthorizationManager
{

    // Override AccessCheck to enforce access control requirements.
    public override bool CheckAccess(OperationContext operationContext)
    {
        AuthorizationContext authContext =
        operationContext.ServiceSecurityContext.AuthorizationContext;
        if (authContext.ClaimSets == null) return false;
        if (authContext.ClaimSets.Count != 1) return false;
        ClaimSet myClaimSet = authContext.ClaimSets[0];
        if (!IssuedBySTS_A(myClaimSet)) return false;
        if (myClaimSet.Count != 1) return false;
        Claim myClaim = myClaimSet[0];
        if (myClaim.ClaimType == "http://www.tmpuri.org:userAuthenticated")
        {
            string resource = myClaim.Resource as string;
            if (resource == null) return false;
            if (resource != "true") return false;
            return true;
        }
        else
        {
            return false;
        }
    }

    // This helper method checks whether SAML Token was issued by STS-A.
    // It compares the Thumbprint Claim of the Issuer against the
    // Certificate of STS-A.
    private bool IssuedBySTS_A(ClaimSet myClaimSet)
    {
        ClaimSet issuerClaimSet = myClaimSet.Issuer;
        if (issuerClaimSet == null) return false;
        if (issuerClaimSet.Count != 1) return false;
        Claim issuerClaim = issuerClaimSet[0];
        if (issuerClaim.ClaimType != ClaimTypes.Thumbprint) return false;
        if (issuerClaim.Resource == null) return false;
        byte[] claimThumbprint = (byte[])issuerClaim.Resource;
        // It is assumed that stsA_Certificate is a variable of type X509Certificate2
        // that is initialized with the Certificate of STS-A.
        X509Certificate2 stsA_Certificate = GetStsACertificate();

        byte[] certThumbprint = stsA_Certificate.GetCertHash();
        if (claimThumbprint.Length != certThumbprint.Length) return false;
        for (int i = 0; i < claimThumbprint.Length; i++)
        {
            if (claimThumbprint[i] != certThumbprint[i]) return false;
        }
        return true;
    }
Public Class STS_B_AuthorizationManager
    Inherits ServiceAuthorizationManager

    ' Override AccessCheck to enforce access control requirements.
    Public Overloads Overrides Function CheckAccess(ByVal operationContext As OperationContext) As Boolean
        Dim authContext = operationContext.ServiceSecurityContext.AuthorizationContext
        If authContext.ClaimSets Is Nothing Then
            Return False
        End If
        If authContext.ClaimSets.Count <> 1 Then
            Return False
        End If
        Dim myClaimSet = authContext.ClaimSets(0)
        If Not IssuedBySTS_A(myClaimSet) Then
            Return False
        End If
        If myClaimSet.Count <> 1 Then
            Return False
        End If
        Dim myClaim = myClaimSet(0)
        If myClaim.ClaimType = "http://www.tmpuri.org:userAuthenticated" Then
            Dim resource = TryCast(myClaim.Resource, String)
            If resource Is Nothing Then
                Return False
            End If
            If resource <> "true" Then
                Return False
            End If
            Return True
        Else
            Return False
        End If
    End Function

    ' This helper method checks whether SAML Token was issued by STS-A. 
    ' It compares the Thumbprint Claim of the Issuer against the 
    ' Certificate of STS-A.
    Private Function IssuedBySTS_A(ByVal myClaimSet As ClaimSet) As Boolean
        Dim issuerClaimSet = myClaimSet.Issuer
        If issuerClaimSet Is Nothing Then
            Return False
        End If
        If issuerClaimSet.Count <> 1 Then
            Return False
        End If
        Dim issuerClaim = issuerClaimSet(0)
        If issuerClaim.ClaimType <> ClaimTypes.Thumbprint Then
            Return False
        End If
        If issuerClaim.Resource Is Nothing Then
            Return False
        End If
        Dim claimThumbprint() = CType(issuerClaim.Resource, Byte())
        ' It is assumed that stsA_Certificate is a variable of type X509Certificate2
        ' that is initialized with the Certificate of STS-A.
        Dim stsA_Certificate = GetStsACertificate()

        Dim certThumbprint() = stsA_Certificate.GetCertHash()
        If claimThumbprint.Length <> certThumbprint.Length Then
            Return False
        End If
        For i = 0 To claimThumbprint.Length - 1
            If claimThumbprint(i) <> certThumbprint(i) Then
                Return False
            End If
        Next i
        Return True
    End Function

Als de toegangscontrole is uitgeschakeld, geeft STS B een SAML-token met de accessAuthorized claim uit.

// Create the list of SAML Attributes.
List<SamlAttribute> samlAttributes = new List<SamlAttribute>();

// Add the accessAuthorized claim.
List<string> strList = new List<string>();
strList.Add("true");
samlAttributes.Add(new SamlAttribute("http://www.tmpuri.org",
"accessAuthorized",
strList));

// Create the SAML token with the accessAuthorized claim. It is assumed that
// the method CreateSamlToken() is implemented as part of STS-B.
SamlSecurityToken samlToken = CreateSamlToken(
    proofToken,
    issuerToken,
    samlConditions,
    samlSubjectNameFormat,
    samlSubjectEmailAddress,
    samlAttributes);
' Create the list of SAML Attributes.
Dim samlAttributes As New List(Of SamlAttribute)()

' Add the accessAuthorized claim.
Dim strList As New List(Of String)()
strList.Add("true")
samlAttributes.Add(New SamlAttribute("http://www.tmpuri.org", "accessAuthorized", strList))

' Create the SAML token with the accessAuthorized claim. It is assumed that 
' the method CreateSamlToken() is implemented as part of STS-B.
Dim samlToken = CreateSamlToken(proofToken, _
                                issuerToken, _
                                samlConditions, _
                                samlSubjectNameFormat, _
                                samlSubjectEmailAddress, _
                                samlAttributes)

STS A

In de volgende afbeelding ziet u de STS A.

Federation

Net als bij STS B is de STS A ook een webservice waarmee beveiligingstokens worden opgegeven en één eindpunt beschikbaar wordt gesteld voor dit doel. Er wordt echter een andere binding (wsHttpBinding) gebruikt en vereist dat gebruikers een geldige CardSpace met een emailAddress claim presenteren. Als reactie geeft het SAML-tokens met de userAuthenticated claim uit. Dit wordt declaratief opgegeven in de serviceconfiguratie.

<system.serviceModel>  
  <services>  
    <service type="FederationSample.STS_A" behaviorConfiguration="STS-A_Behavior">  
      <endpoint address=""  
                binding="wsHttpBinding"  
                bindingConfiguration="STS-A_Binding"  
                contract="FederationSample.ISts">  
       <identity>  
       <certificateReference findValue="CN=FederationSample.com"
                       x509FindType="FindBySubjectDistinguishedName"  
                       storeLocation="LocalMachine"
                       storeName="My" />  
       </identity>  
    </endpoint>  
  </service>  
</services>  
  
<bindings>  
  <wsHttpBinding>  
  <!-- This is the binding used by STS-A. It requires users to present  
   a CardSpace. -->  
    <binding name='STS-A_Binding'>  
      <security mode='Message'>  
        <message clientCredentialType="CardSpace" />  
      </security>  
    </binding>  
  </wsHttpBinding>  
</bindings>  
  
<behaviors>  
  <behavior name='STS-A_Behavior'>  
    <serviceAuthorization operationRequirementType=  
     "FederationSample.STS_A_OperationRequirement, STS_A" />  
      <serviceCredentials>  
  <serviceCertificate findValue="CN=FederationSample.com"  
                     x509FindType='FindBySubjectDistinguishedName'  
                     storeLocation='LocalMachine'  
                     storeName='My' />  
      </serviceCredentials>  
    </behavior>  
  </behaviors>  
</system.serviceModel>  

Tijdens runtime dwingt de STS_A_OperationRequirement klasse dit beleid af, dat wordt geïmplementeerd als onderdeel van STS A.


public class STS_A_AuthorizationManager : ServiceAuthorizationManager
{
    // Override AccessCheck to enforce access control requirements.
    public override bool CheckAccess(OperationContext operationContext)
    {
        AuthorizationContext authContext =
        operationContext.ServiceSecurityContext.AuthorizationContext;
        if (authContext.ClaimSets == null) return false;
        if (authContext.ClaimSets.Count != 1) return false;
        ClaimSet myClaimSet = authContext.ClaimSets[0];
        if (myClaimSet.Count != 1) return false;
        Claim myClaim = myClaimSet[0];
        if ((myClaim.ClaimType ==
        @"http://schemas.microsoft.com/ws/2005/05/identity/claims:EmailAddress") &&
        (myClaim.Right == Rights.PossessProperty))
        {
            string emailAddress = myClaim.Resource as string;
            if (emailAddress == null) return false;
            if (!IsValidEmailAddress(emailAddress)) return false;
            return true;
        }
        else
        {
            return false;
        }
    }

    // This helper method performs a rudimentary check for whether
    //a given email is valid.
    private static bool IsValidEmailAddress(string emailAddress)
    {
        string[] splitEmail = emailAddress.Split('@');
        if (splitEmail.Length != 2) return false;
        if (!splitEmail[1].Contains(".")) return false;
        return true;
    }
}
Public Class STS_A_AuthorizationManager
    Inherits ServiceAuthorizationManager

    ' Override AccessCheck to enforce access control requirements.
    Public Overloads Overrides Function CheckAccess(ByVal operationContext As OperationContext) As Boolean
        Dim authContext = operationContext.ServiceSecurityContext.AuthorizationContext
        If authContext.ClaimSets Is Nothing Then
            Return False
        End If
        If authContext.ClaimSets.Count <> 1 Then
            Return False
        End If
        Dim myClaimSet = authContext.ClaimSets(0)
        If myClaimSet.Count <> 1 Then
            Return False
        End If
        Dim myClaim = myClaimSet(0)
        If myClaim.ClaimType = "http://schemas.microsoft.com/ws/2005/05/identity/claims:EmailAddress" AndAlso myClaim.Right = Rights.PossessProperty Then
            Dim emailAddress = TryCast(myClaim.Resource, String)
            If emailAddress Is Nothing Then
                Return False
            End If
            If Not IsValidEmailAddress(emailAddress) Then
                Return False
            End If
            Return True
        Else
            Return False
        End If
    End Function

    ' This helper method performs a rudimentary check for whether 
    'a given email is valid.
    Private Shared Function IsValidEmailAddress(ByVal emailAddress As String) As Boolean
        Dim splitEmail() = emailAddress.Split("@"c)
        If splitEmail.Length <> 2 Then
            Return False
        End If
        If Not splitEmail(1).Contains(".") Then
            Return False
        End If
        Return True
    End Function
End Class

Als de toegang is true, geeft STS A een SAML-token met userAuthenticated claim uit.

// Create the list of SAML Attributes.
List<SamlAttribute> samlAttributes = new List<SamlAttribute>();
// Add the userAuthenticated claim.
List<string> strList = new List<string>();
strList.Add("true");
SamlAttribute mySamlAttribute = new SamlAttribute("http://www.tmpuri.org",
     "userAuthenticated", strList);
samlAttributes.Add(mySamlAttribute);
// Create the SAML token with the userAuthenticated claim. It is assumed that
// the method CreateSamlToken() is implemented as part of STS-A.
SamlSecurityToken samlToken = CreateSamlToken(
    proofToken,
    issuerToken,
    samlConditions,
    samlSubjectNameFormat,
    samlSubjectEmailAddress,
    samlAttributes);
' Create the list of SAML Attributes.
Dim samlAttributes As New List(Of SamlAttribute)()
' Add the userAuthenticated claim.
Dim strList As New List(Of String)()
strList.Add("true")
Dim mySamlAttribute As New SamlAttribute("http://www.tmpuri.org", _
                                         "userAuthenticated", _
                                         strList)
samlAttributes.Add(mySamlAttribute)
' Create the SAML token with the userAuthenticated claim. It is assumed that 
' the method CreateSamlToken() is implemented as part of STS-A.
Dim samlToken = CreateSamlToken(proofToken, issuerToken, samlConditions, _
                                samlSubjectNameFormat, _
                                samlSubjectEmailAddress, _
                                samlAttributes)

Client bij Organization A

In de volgende afbeelding ziet u de client in organisatie A, samen met de stappen voor het maken van een MyService serviceaanroep. De andere functionele onderdelen zijn ook opgenomen voor volledigheid.

Diagram showing the steps in a MyService service call.

Samenvatting

Federatieve beveiliging biedt een schone verdeling van verantwoordelijkheid en helpt bij het bouwen van veilige, schaalbare servicearchitecturen. Als platform voor het bouwen en implementeren van gedistribueerde toepassingen biedt WCF systeemeigen ondersteuning voor het implementeren van federatieve beveiliging.

Zie ook