Federasyon

Bu konu, federasyon güvenliği kavramına kısa bir genel bakış sağlar. Ayrıca, federasyon güvenlik mimarilerini dağıtmak için Windows Communication Foundation (WCF) desteğini açıklar. Federasyonu gösteren örnek bir uygulama için bkz . Federasyon Örneği.

Federasyon Güvenliğinin Tanımı

Federasyon güvenliği, istemcinin eriştiği hizmetle ilişkili kimlik doğrulaması ve yetkilendirme yordamları arasında temiz ayrım yapılmasını sağlar. Federasyon güvenliği, farklı güven bölgelerindeki birden çok sistem, ağ ve kuruluş arasında işbirliğine de olanak tanır.

WCF, federasyon güvenliğini kullanan dağıtılmış sistemler oluşturmak ve dağıtmak için destek sağlar.

Federasyon Güvenlik Mimarisinin Öğeleri

Federasyon güvenlik mimarisi, aşağıdaki tabloda açıklandığı gibi üç temel öğeye sahiptir.

Öğe Açıklama
Etki alanı/bölge Tek bir güvenlik yönetimi veya güven birimi. Tipik bir etki alanı tek bir kuruluş içerebilir.
Federasyon Güven oluşturan etki alanları koleksiyonu. Güven düzeyi farklılık gösterebilir, ancak genellikle kimlik doğrulaması ve neredeyse her zaman yetkilendirme içerir. Tipik bir federasyon, bir kaynak kümesine paylaşılan erişim için güven oluşturan bir dizi kuruluşu içerebilir.
Güvenlik Belirteci Hizmeti (STS) Güvenlik belirteçleri veren bir Web hizmeti; başka bir ifadeyle, kime güvenirse güvensin, kanıta dayalı olarak onaylar yapar. Bu, etki alanları arasında güven aracısı oluşturmanın temelini oluşturur.

Örnek Senaryo

Aşağıdaki çizimde federasyon güvenliği örneği gösterilmektedir:

Diagram showing a typical federated security scenario.

Bu senaryo iki kuruluşu içerir: A ve B. B kuruluşu, kuruluştaki bazı kullanıcıların değerli bulduğu bir Web kaynağına (Web hizmeti) sahiptir.

Not

Bu bölümde kaynak, hizmet ve Web hizmeti terimleri birbirinin yerine kullanılır.

Genellikle B kuruluşu, hizmete erişmeden önce A kuruluşundan bir kullanıcının geçerli bir kimlik doğrulaması biçimi sağlamasını gerektirir. Ayrıca kuruluş, kullanıcının söz konusu kaynağa erişme yetkisine sahip olmasını da gerektirebilir. Bu sorunu gidermenin ve A kuruluşundaki kullanıcıların B kuruluşundaki kaynağa erişmesini sağlamanın bir yolu aşağıdaki gibidir:

  • A kuruluşundan kullanıcılar kimlik bilgilerini (kullanıcı adı ve parola) B kuruluşuna kaydeder.

  • Kaynak erişimi sırasında, A kuruluşundaki kullanıcılar kimlik bilgilerini B kuruluşuna sunar ve kaynağa erişmeden önce kimlik doğrulaması yapılır.

Bu yaklaşımın üç önemli dezavantajı vardır:

  • B kuruluşunun, yerel kullanıcılarının kimlik bilgilerini yönetmeye ek olarak A kuruluşundaki kullanıcıların kimlik bilgilerini de yönetmesi gerekir.

  • Kuruluştaki kullanıcılar A kuruluşundaki kaynaklara erişmek için normalde kullandıkları kimlik bilgileri dışında ek bir kimlik bilgileri kümesi (başka bir kullanıcı adı ve parola anımsamak) gerekir. Bu genellikle, zayıf bir güvenlik önlemi olan birden çok hizmet alanında aynı kullanıcı adı ve parolayı kullanma uygulamasını teşvik eder.

  • Daha fazla kuruluş B kuruluşundaki kaynağı bir değer olarak algıladıkça mimari ölçeklendirilmiyor.

Daha önce bahsedilen dezavantajları ele alan alternatif bir yaklaşım, federasyon güvenliğini kullanmaktır. Bu yaklaşımda, A ve B kuruluşları bir güven ilişkisi kurar ve yerleşik güvenin aracısını etkinleştirmek için Güvenlik Belirteci Hizmeti'ni (STS) kullanır.

Federasyon güvenlik mimarisinde, A kuruluşundaki kullanıcılar B kuruluşundaki Web hizmetine erişmek istediklerinde, B kuruluşundaki STS'den geçerli bir güvenlik belirteci sunmaları gerektiğini bilirler. Bu belirteç, belirli bir hizmete erişimlerinin kimliğini doğrular ve yetki verir.

STS B ile iletişim kurarken, kullanıcılar STS ile ilişkili ilkeden başka bir dolaylılık düzeyi alır. STS B'nin onlara bir güvenlik belirteci vermesinden önce STS A'dan (istemci güven bölgesi) geçerli bir güvenlik belirteci sunmaları gerekir. Bu, iki kuruluş arasında kurulan güven ilişkisinin bir kaydıdır ve B kuruluşunun A kuruluşundaki kullanıcılar için kimlikleri yönetmek zorunda olmadığını gösterir. Uygulamada STS B genellikle null issuerAddress ve issuerMetadataAddressdeğerlerine sahiptir. Daha fazla bilgi için bkz . Nasıl yapılır: Yerel Vereni Yapılandırma. Bu durumda, istemci STS A'yı bulmak için yerel bir ilkeye başvurur. Bu yapılandırma ev bölgesi federasyonu olarak adlandırılır ve STS B'nin STS A hakkındaki bilgileri tutması gerekmediğinden daha iyi ölçeklendirilir.

Kullanıcılar daha sonra A kuruluşundaki STS'ye başvurur ve normalde A kuruluşundaki diğer kaynaklara erişim elde etmek için kullandıkları kimlik doğrulama kimlik bilgilerini sunarak bir güvenlik belirteci alır. Bu, kullanıcıların birden çok kimlik bilgisi kümesini tutması veya birden çok hizmet sitelerinde aynı kimlik bilgileri kümesini kullanması sorununu da giderir.

Kullanıcılar STS A'dan bir güvenlik belirteci aldıktan sonra belirteci STS B'ye sunar. B Kuruluşu, kullanıcıların isteklerinin yetkilendirmesini gerçekleştirmeye devam eder ve kullanıcılara kendi güvenlik belirteçleri kümesinden bir güvenlik belirteci verir. Kullanıcılar daha sonra belirtecini B kuruluşundaki kaynağa sunabilir ve hizmete erişebilir.

WCF'de Federasyon Güvenliği desteği

WCF, wsFederationHttpBinding> aracılığıyla <federasyon güvenlik mimarilerini dağıtmak için anahtar teslimi destek sağlar.

<wsFederationHttpBinding> öğesi, http'nin istek-yanıt iletişim stili için temel aktarım mekanizması olarak kullanılmasını gerektiren güvenli, güvenilir, birlikte çalışabilen bir bağlama sağlar ve kodlama için kablo biçimi olarak metin ve XML kullanır.

Federasyon güvenlik senaryosunda wsFederationHttpBinding> kullanımı<, aşağıdaki bölümlerde açıklandığı gibi mantıksal olarak bağımsız iki aşamaya ayrılmış olabilir.

1. Aşama: Tasarım Aşaması

Tasarım aşamasında istemci, hizmet uç noktasının kullanıma sunduğu ilkeyi okumak ve hizmetin kimlik doğrulaması ve yetkilendirme gereksinimlerini toplamak için ServiceModel Meta Veri Yardımcı Programı Aracı'nı (Svcutil.exe) kullanır. İstemcide aşağıdaki federasyon güvenlik iletişim desenini oluşturmak için uygun proxy'ler oluşturulur:

  • İstemci güvenindeki STS'den bir güvenlik belirteci alın.

  • Belirteci hizmet güveni alanında STS'ye sunun.

  • Hizmet güveni alanında STS'den bir güvenlik belirteci alın.

  • Hizmete erişmek için belirteci hizmete sunun.

2. Aşama: Çalışma Zamanı Aşaması

Çalışma zamanı aşamasında, istemci WCF istemci sınıfının bir nesnesini başlatır ve WCF istemcisini kullanarak bir çağrı yapar. WCF'nin temel alınan çerçevesi, federasyon güvenlik iletişim düzeninde daha önce bahsedilen adımları işler ve istemcinin hizmeti sorunsuz bir şekilde kullanmasına olanak tanır.

WCF Kullanarak Örnek Uygulama

Aşağıdaki çizimde WCF'den yerel destek kullanan federasyon güvenlik mimarisi için örnek bir uygulama gösterilmektedir.

Diagram showing a sample Federation security implementation.

Örnek MyService

Hizmet MyService aracılığıyla MyServiceEndpointtek bir uç noktayı kullanıma sunar. Aşağıdaki çizimde uç noktayla ilişkili adres, bağlama ve sözleşme gösterilmektedir.

Diagram showing the MyServiceEndpoint details.

Hizmet uç noktası MyServiceEndpoint wsFederationHttpBinding> kullanır <ve STS B tarafından verilen bir taleple geçerli bir accessAuthorized Güvenlik Onayları Biçimlendirme Dili (SAML) belirteci gerektirir. Bu, hizmet yapılandırmasında bildirim temelli olarak belirtilir.

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

Not

tarafından MyServiceistenen talepler hakkında küçük bir noktaya dikkat edilmelidir. İkinci şekil, MyService taleple birlikte bir SAML belirteci gerektirdiğini accessAuthorized gösterir. Daha kesin olmak gerekirse, bunu gerektiren talep türünü MyService belirtir. Bu talep türünün http://tempuri.org:accessAuthorized tam adı ( ilişkili ad alanıyla birlikte) hizmet yapılandırma dosyasında kullanılır. Bu talebin değeri, bu talebin varlığını gösterir ve STS B tarafından olarak ayarlandığı true varsayılır.

Çalışma zamanında bu ilke, öğesinin MyServiceOperationRequirement bir parçası MyServiceolarak uygulanan sınıfı tarafından zorlanır.

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

Aşağıdaki çizimde STS B gösterilmektedir. Daha önce belirtildiği gibi, bir güvenlik belirteci hizmeti (STS) aynı zamanda bir Web hizmetidir ve ilişkili uç noktalarına, ilkelerine vb. sahip olabilir.

Diagram showing security token service B.

STS B, güvenlik belirteçleri istemek için kullanılabilecek adlı STSEndpoint tek bir uç noktayı kullanıma sunar. Özellikle, STS B, hizmete erişmek için hizmet sitesinde sunulabilen MyService taleple accessAuthorized SAML belirteçleri oluşturur. Ancak STS B, kullanıcıların talebi içeren STS A tarafından verilen geçerli bir SAML belirteci sunmalarını userAuthenticated gerektirir. Bu, STS yapılandırmasında bildirim temelli olarak belirtilir.

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

Not

Yine talep, userAuthenticated STS B tarafından gerekli olan talep türüdür. Bu talep türünün tam adı , http://tempuri.org:userAuthenticated STS yapılandırma dosyasında kullanılan ad alanıyla birliktedir (ilişkili ad alanıyla birlikte). Bu talebin değeri, bu talebin varlığını gösterir ve STS A tarafından olarak ayarlandığı true varsayılır.

Çalışma zamanında sınıfı, STS_B_OperationRequirement STS B'nin bir parçası olarak uygulanan bu ilkeyi zorlar.

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

Erişim denetimi açıksa STS B, taleple birlikte bir SAML belirteci oluşturur accessAuthorized .

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

Aşağıdaki çizimde STS A gösterilmektedir.

Federation

STS B'ye benzer şekilde STS A da güvenlik belirteçleri veren ve bu amaçla tek bir uç noktayı kullanıma sunan bir Web hizmetidir. Ancak, farklı bir bağlama (wsHttpBinding) kullanır ve kullanıcıların bir taleple emailAddress geçerli bir CardSpace sunmalarını gerektirir. Yanıt olarak, taleple BIRLIKTE userAuthenticated SAML belirteçleri düzenler. Bu, hizmet yapılandırmasında bildirim temelli olarak belirtilir.

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

Çalışma zamanında sınıfı, STS_A_OperationRequirement STS A'nın bir parçası olarak uygulanan bu ilkeyi zorlar.


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

Erişim ise true, STS A taleple userAuthenticated bir SAML belirteci dağıtır.

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

Kuruluş A'daki İstemci

Aşağıdaki çizimde A kuruluşundaki istemcinin yanı sıra hizmet çağrısı yapma MyService adımları gösterilmektedir. Tümlük için diğer işlevsel bileşenler de dahil edilir.

Diagram showing the steps in a MyService service call.

Özet

Federasyon güvenliği, temiz bir sorumluluk bölümü sağlar ve güvenli, ölçeklenebilir hizmet mimarileri oluşturmaya yardımcı olur. WcF, dağıtılmış uygulamalar oluşturmaya ve dağıtmaya yönelik bir platform olarak federasyon güvenliği uygulamak için yerel destek sağlar.

Ayrıca bkz.