Sdílet prostřednictvím


Federace

Toto téma obsahuje stručný přehled konceptu federovaného zabezpečení. Popisuje také podporu Technologie WCF (Windows Communication Foundation) pro nasazení federovaných architektur zabezpečení. Ukázkovou aplikaci, která demonstruje federaci, najdete v části Ukázka federace.

Definice federovaného zabezpečení

Federované zabezpečení umožňuje čisté oddělení mezi službou, ke které klient přistupuje, a přidruženými ověřovacími a autorizačními postupy. Federované zabezpečení také umožňuje spolupráci v různých systémech, sítích a organizacích v různých sférách důvěryhodnosti.

WCF poskytuje podporu pro sestavování a nasazování distribuovaných systémů, které využívají federované zabezpečení.

Prvky architektury federovaného zabezpečení

Architektura federovaného zabezpečení má tři klíčové prvky, jak je popsáno v následující tabulce.

Element (Prvek) Popis
Doména nebo sféra Jedna jednotka správy zabezpečení nebo důvěryhodnosti. Typická doména může zahrnovat jednu organizaci.
Federace Kolekce domén, které navazovaly vztah důvěryhodnosti. Úroveň důvěryhodnosti se může lišit, ale obvykle zahrnuje ověřování a téměř vždy zahrnuje autorizaci. Typická federace může zahrnovat řadu organizací, které si vytvořily vztah důvěryhodnosti pro sdílený přístup k sadě prostředků.
Služba tokenů zabezpečení (STS) Webová služba, která vydává tokeny zabezpečení; to znamená, že provádí kontrolní výrazy založené na důkazech, kterým důvěřuje, komu důvěřuje. To tvoří základ pro zprostředkování důvěryhodnosti mezi doménami.

Ukázkový scénář

Následující obrázek ukazuje příklad federovaného zabezpečení:

Diagram showing a typical federated security scenario.

Tento scénář zahrnuje dvě organizace: A a B. Organizace B má webový prostředek (webovou službu), kterou někteří uživatelé v organizaci A hledají cenné.

Poznámka:

V této části se zaměnitelně používají podmínky prostředku, služby a webové služby .

Organizace B obvykle vyžaduje, aby uživatel z organizace A před přístupem ke službě zadal určitou platnou formu ověřování. Kromě toho může organizace vyžadovat, aby uživatel byl autorizovaný pro přístup ke konkrétnímu prostředku. Jedním ze způsobů, jak tento problém vyřešit a umožnit uživatelům v organizaci A přístup k prostředku v organizaci B, je následující:

  • Uživatelé z organizace A zaregistrují svoje přihlašovací údaje (uživatelské jméno a heslo) v organizaci B.

  • Během přístupu k prostředkům předkládají uživatelé z organizace A své přihlašovací údaje organizaci B a před přístupem k prostředku se ověřují.

Tento přístup má tři významné nevýhody:

  • Organizace B musí kromě správy přihlašovacích údajů místních uživatelů spravovat přihlašovací údaje pro uživatele z organizace A.

  • Uživatelé v organizaci A musí udržovat další sadu přihlašovacích údajů (to znamená pamatovat si další uživatelské jméno a heslo) kromě přihlašovacích údajů, které obvykle používají k získání přístupu k prostředkům v organizaci A. To obvykle podporuje postup použití stejného uživatelského jména a hesla na více lokalitách služeb, což je slabé bezpečnostní opatření.

  • Architektura se neškvětuje, protože více organizací považuje prostředek organizace B za určitou hodnotu.

Alternativním přístupem, který řeší dříve zmíněné nevýhody, je použití federovaného zabezpečení. V tomto přístupu organizace A a B vytvářejí vztah důvěryhodnosti a využívají službu tokenů zabezpečení (STS) k umožnění zprostředkování zavedeného vztahu důvěryhodnosti.

V architektuře federovaného zabezpečení uživatelé z organizace A vědí, že pokud chtějí získat přístup k webové službě v organizaci B, musí předložit platný token zabezpečení ze služby ZABEZPEČENÍ v organizaci B, který ověřuje a autorizuje jejich přístup ke konkrétní službě.

Při kontaktování služby STS B obdrží uživatelé další úroveň nepřímého přístupu ze zásad přidružených ke službě STS. Musí předložit platný token zabezpečení ze služby STS A (tj. sféry důvěryhodnosti klienta) předtím, než je služba STS B může vydat token zabezpečení. Jedná se o zápis vztahu důvěryhodnosti mezi těmito dvěma organizacemi a znamená to, že organizace B nemusí spravovat identity pro uživatele z organizace A. V praxi má služba STS B obvykle hodnotu null issuerAddress a issuerMetadataAddress. Další informace naleznete v tématu Postupy: Konfigurace místního vystavitele. V takovém případě klient vyhledá stS A místní zásadu. Tato konfigurace se nazývá federace domovské sféry a škáluje se lépe, protože služba STS B nemusí udržovat informace o službě STS A.

Uživatelé pak kontaktují službu stS v organizaci A a získávají token zabezpečení tím, že předkládají ověřovací přihlašovací údaje, které obvykle používají k získání přístupu k jakémukoli jinému prostředku v organizaci A. To také snižuje problém uživatelů, kteří musí udržovat více sad přihlašovacích údajů nebo používat stejnou sadu přihlašovacích údajů na více lokalitách služeb.

Jakmile uživatelé z tokenu ZABEZPEČENÍ A obdrží token zabezpečení, předají token službě STS B. Organizace B bude provádět autorizaci požadavků uživatelů a vydává token zabezpečení uživatelům ze své vlastní sady tokenů zabezpečení. Uživatelé pak můžou předložit token prostředku v organizaci B a získat přístup ke službě.

Podpora federovaného zabezpečení ve WCF

WCF poskytuje podporu pro nasazení federovaných architektur zabezpečení prostřednictvím wsFederationHttpBinding>.<

Element <wsFederationHttpBinding> poskytuje zabezpečenou, spolehlivou a interoperabilní vazbu, která zahrnuje použití protokolu HTTP jako základního přenosového mechanismu pro styl komunikace s odpověďmi požadavku, použití textu a XML jako přenosového formátu pro kódování.

Použití wsFederationHttpBinding ><ve scénáři federovaného zabezpečení je možné oddělit do dvou logicky nezávislých fází, jak je popsáno v následujících částech.

Fáze 1: Fáze návrhu

Během fáze návrhu klient používá nástroj ServiceModel Metadata Utility (Svcutil.exe) ke čtení zásad, které koncový bod služby zveřejňuje, a ke shromažďování požadavků na ověřování a autorizaci služby. Příslušné proxy servery jsou vytvořené tak, aby v klientovi vytvořily následující model komunikace federovaného zabezpečení:

  • Získejte token zabezpečení ze služby ZABEZPEČENÍ v sférě důvěryhodnosti klienta.

  • Prezentujte token službě STS v sférě důvěryhodnosti služby.

  • Získejte token zabezpečení ze služby STS v sférě důvěryhodnosti služby.

  • Prezentujte token službě pro přístup ke službě.

Fáze 2: Fáze běhu

Během fáze běhu klient vytvoří instanci objektu třídy klienta WCF a zavolá pomocí klienta WCF. Základní architektura WCF zpracovává dříve uvedené kroky v modelu komunikace federovaného zabezpečení a umožňuje klientovi bezproblémově využívat službu.

Ukázková implementace pomocí WCF

Následující obrázek znázorňuje ukázkovou implementaci federované architektury zabezpečení pomocí nativní podpory wcf.

Diagram showing a sample Federation security implementation.

Příklad MyService

Služba MyService zveřejňuje jeden koncový bod prostřednictvím MyServiceEndpoint. Následující obrázek znázorňuje adresu, vazbu a kontrakt přidružený ke koncovému bodu.

Diagram showing the MyServiceEndpoint details.

Koncový bod MyServiceEndpoint služby používá <wsFederationHttpBinding> a vyžaduje platný token SAML (Security Assertions Markup Language) s accessAuthorized deklarací identity vystavenou službou STS B. Toto je deklarativní zadané v konfiguraci služby.

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

Poznámka:

Je třeba poznamenat drobný bod o deklarací, které MyServicevyžaduje . Druhý obrázek označuje, že MyService vyžaduje token SAML s deklarací accessAuthorized identity. Aby bylo přesnější, určuje typ deklarace identity, který MyService vyžaduje. Plně kvalifikovaný název tohoto typu deklarace identity je http://tempuri.org:accessAuthorized (spolu s přidruženým oborem názvů), který se používá v konfiguračním souboru služby. Hodnota této deklarace identity označuje přítomnost této deklarace identity a předpokládá se, že je nastavena true službou STS B.

V době běhu je tato zásada vynucena MyServiceOperationRequirement třídou, která je implementována jako součást 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

Následující obrázek znázorňuje stS B. Jak jsme uvedli dříve, služba tokenů zabezpečení (STS) je také webová služba a může mít přidružené koncové body, zásady atd.

Diagram showing security token service B.

StS B zveřejňuje jeden koncový bod, který STSEndpoint se dá použít k vyžádání tokenů zabezpečení. Konkrétně služba STS B vydává tokeny SAML s accessAuthorized deklarací identity, které je možné předložit v MyService lokalitě služby pro přístup ke službě. StS B však vyžaduje, aby uživatelé předložili platný token SAML vydaný službou STS A, který obsahuje userAuthenticated deklaraci identity. Toto je deklarativní zadané v konfiguraci služby STS.

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

Poznámka:

Deklarace identity je typ deklarace identity userAuthenticated , který vyžaduje služba STS B. Plně kvalifikovaný název tohoto typu deklarace identity je http://tempuri.org:userAuthenticated (spolu s přidruženým oborem názvů), který se používá v konfiguračním souboru STS. Hodnota této deklarace identity označuje přítomnost této deklarace identity a předpokládá se, že je nastavena službou true STS A.

V době STS_B_OperationRequirement běhu třída vynucuje tuto zásadu, která je implementována jako součást služby 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

Pokud je kontrola přístupu jasná, služba STS B vydá token SAML s accessAuthorized deklarací identity.

// 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

Následující obrázek znázorňuje stS A.

Federation

Podobně jako služba STS B je služba STS A také webová služba, která vydává tokeny zabezpečení a zpřístupňuje pro tento účel jeden koncový bod. Používá ale jinou vazbu (wsHttpBinding) a vyžaduje, aby uživatelé předložili platný CardSpace s deklarací emailAddress identity. V reakci na to vydává tokeny SAML s deklarací userAuthenticated identity. Toto je deklarativní zadané v konfiguraci služby.

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

V době STS_A_OperationRequirement běhu třída vynucuje tuto zásadu, která je implementována jako součást služby 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

Pokud je truepřístup, služba STS A vydá token SAML s userAuthenticated deklarací identity.

// 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)

Klient ve společnosti Organization A

Následující obrázek znázorňuje klienta v organizaci A spolu s kroky, které jsou součástí volání MyService služby. Další funkční komponenty jsou také zahrnuty pro úplnost.

Diagram showing the steps in a MyService service call.

Shrnutí

Federované zabezpečení poskytuje čisté rozdělení odpovědnosti a pomáhá vytvářet zabezpečené a škálovatelné architektury služeb. Jako platforma pro vytváření a nasazování distribuovaných aplikací poskytuje WCF nativní podporu pro implementaci federovaného zabezpečení.

Viz také