Megosztás a következőn keresztül:


Összevonás

Ez a témakör rövid áttekintést nyújt az összevont biztonság fogalmáról. Emellett ismerteti a Windows Communication Foundation (WCF) összevont biztonsági architektúrák üzembe helyezésének támogatását is. Az összevonást szemléltető mintaalkalmazások esetében lásd az összevonási mintát.

Az összevont biztonság meghatározása

Az összevont biztonság lehetővé teszi az ügyfél által elérhető szolgáltatás és a kapcsolódó hitelesítési és engedélyezési eljárások tiszta elkülönítését. Az összevont biztonság emellett lehetővé teszi a különböző megbízhatósági tartományokban lévő rendszerek, hálózatok és szervezetek közötti együttműködést is.

A WCF támogatja az összevont biztonságot alkalmazó elosztott rendszerek kiépítését és üzembe helyezését.

Összevont biztonsági architektúra elemei

Az összevont biztonsági architektúra három fő elemből áll, az alábbi táblázatban leírtak szerint.

Elem Leírás
Tartomány/tartomány A biztonsági felügyelet vagy a megbízhatóság egyetlen egysége. Egy tipikus tartomány egyetlen szervezetet is tartalmazhat.
Összevonás Olyan tartományok gyűjteménye, amelyek megbízhatóságot hoztak létre. A megbízhatósági szint eltérő lehet, de általában hitelesítést is tartalmaz, és szinte mindig tartalmazza az engedélyezést. Egy tipikus összevonás több olyan szervezetet is tartalmazhat, amelyek megbízhatóságot hoztak létre az erőforrások egy csoportjához való megosztott hozzáféréshez.
Security Token Service (STS) Egy webszolgáltatás, amely biztonsági jogkivonatokat ad ki; vagyis a megbízhatóságot tanúsító bizonyítékokon alapuló állításokat tesz, attól függően, hogy ki bízik benne. Ez képezi a tartományok közötti bizalmi közvetítői kapcsolat alapját.

Példaforgatókönyv

Az alábbi ábra egy összevont biztonsági példát mutat be:

Diagram showing a typical federated security scenario.

Ez a forgatókönyv két szervezetet tartalmaz: A és B. A B szervezet rendelkezik egy webes erőforrással (egy webszolgáltatással), amelyet az A szervezet egyes felhasználói értékesnek találnak.

Feljegyzés

Ez a szakasz az erőforrás, a szolgáltatás és a webszolgáltatás kifejezéseket használja felcserélhetően.

A B szervezet általában megköveteli, hogy az A szervezet egy felhasználója érvényes hitelesítést biztosítson a szolgáltatás elérése előtt. Emellett a szervezet megkövetelheti, hogy a felhasználó hozzáférjen a szóban forgó erőforráshoz. A probléma megoldásának és az A szervezet felhasználói számára az erőforrás B szervezetben való elérésének engedélyezésének egyik módja a következő:

  • Az A szervezet felhasználói regisztrálják hitelesítő adataikat (felhasználónév és jelszó) a B szervezetnél.

  • Az erőforrás-hozzáférés során az A szervezet felhasználói bemutatják hitelesítő adataikat a B szervezetnek, és hitelesítést kapnak az erőforrás elérése előtt.

Ennek a megközelítésnek három jelentős hátránya van:

  • A B szervezetnek a helyi felhasználók hitelesítő adatainak kezelése mellett az A szervezet felhasználóinak hitelesítő adatait is kezelnie kell.

  • A szervezet felhasználóinak az A szervezeten belüli erőforrásokhoz való hozzáféréshez általában használt hitelesítő adatokon kívül további hitelesítő adatokat (azaz egy további felhasználónevet és jelszót is meg kell őrizniük) kell fenntartaniuk. Ez általában arra ösztönzi a gyakorlatot, hogy ugyanazt a felhasználónevet és jelszót használja több szolgáltatáswebhelyen, ami gyenge biztonsági intézkedés.

  • Az architektúra nem skálázható, mivel a B szervezet erőforrását több szervezet valamilyen értéknek tekinti.

A korábban említett hátrányokkal foglalkozó alternatív megközelítés az összevont biztonság alkalmazása. Ebben a megközelítésben az A és B szervezetek megbízhatósági kapcsolatot létesítenek, és a Security Token Service (STS) szolgáltatást alkalmazzák a létrehozott megbízhatóság közvetítésének engedélyezéséhez.

Az összevont biztonsági architektúrában az A szervezet felhasználói tudják, hogy ha a B szervezet webszolgáltatásához szeretnének hozzáférni, akkor érvényes biztonsági jogkivonatot kell bemutatniuk az STS-ből a B szervezetnél, amely hitelesíti és engedélyezi az adott szolgáltatáshoz való hozzáférést.

Az STS B-vel való kapcsolatfelvételkor a felhasználók egy másik szintű közvetett kapcsolatot kapnak az STS-hez társított szabályzatból. Érvényes biztonsági jogkivonatot kell bemutatniuk az STS A-ből (vagyis az ügyfélmegbízhatósági tartományból), mielőtt az STS B biztonsági jogkivonatot bocsáthat ki számukra. Ez a két szervezet közötti megbízhatósági kapcsolat kuratóriuma, és azt jelenti, hogy a B szervezetnek nem kell kezelnie az A szervezet felhasználóinak identitásait. A gyakorlatban az STS B általában null és issuerAddressissuerMetadataAddress. További információ : Helyi kiállító konfigurálása. Ebben az esetben az ügyfél egy helyi szabályzattal keresi meg az STS A-t. Ezt a konfigurációt otthoni tartományok összevonásának nevezzük, és jobban skálázható, mert az STS B-nek nem kell az STS A-vel kapcsolatos információkat fenntartania.

A felhasználók ezután kapcsolatba lépnek az STS-sel az A szervezetnél, és egy biztonsági jogkivonatot szereznek be olyan hitelesítési hitelesítő adatok bemutatásával, amelyeket általában az A szervezet bármely más erőforrásához való hozzáféréshez használnak. Ez azt a problémát is enyhíti, hogy a felhasználóknak több hitelesítőadat-készletet kell fenntartaniuk, vagy ugyanazt a hitelesítőadat-készletet kell használniuk több szolgáltatáswebhelyen.

Miután a felhasználók beszereztek egy biztonsági jogkivonatot az STS A-ből, a jogkivonatot az STS B-nek mutatják be. A B szervezet folytatja a felhasználók kéréseinek engedélyezését, és biztonsági jogkivonatot ad ki a felhasználóknak a saját biztonsági jogkivonataiból. A felhasználók ezután bemutathatják jogkivonatukat a B szervezet erőforrásának, és hozzáférhetnek a szolgáltatáshoz.

Összevont biztonság támogatása a WCF-ben

A WCF kulcsrakész támogatást nyújt az összevont biztonsági architektúrák központi telepítéséhez a <wsFederationHttpBinding> használatával.

A <wsFederationHttpBinding> elem biztonságos, megbízható, interoperálható kötést biztosít, amely magában foglalja a HTTP használatát a kérelem-válasz kommunikációs stílus alapjául szolgáló átviteli mechanizmusként, a kódoláshoz szöveg és XML használatával.

A wsFederationHttpBinding> használata <összevont biztonsági forgatókönyvben két logikailag független fázisra bontható, az alábbi szakaszokban leírtak szerint.

1. fázis: Tervezési fázis

A tervezési fázis során az ügyfél a ServiceModel Metaadat-segédprogrammal (Svcutil.exe) olvassa el a szolgáltatásvégpont által elérhetővé tott szabályzatot, és gyűjtse össze a szolgáltatás hitelesítési és engedélyezési követelményeit. A megfelelő proxyk a következő összevont biztonsági kommunikációs minta létrehozásához jönnek létre az ügyfélnél:

  • Szerezze be a biztonsági jogkivonatot az STS-ből az ügyfél megbízhatósági tartományában.

  • Adja meg a jogkivonatot az STS-nek a szolgáltatásmegbízhatósági területen.

  • Szerezze be a biztonsági jogkivonatot az STS-ből a szolgáltatásmegbízhatósági területen.

  • A szolgáltatás eléréséhez mutassa be a jogkivonatot a szolgáltatásnak.

2. fázis: Futásidejű fázis

A futásidejű fázisban az ügyfél példányosítja a WCF-ügyfélosztály egyik objektumát, és hívást kezdeményez a WCF-ügyfél használatával. A WCF mögöttes keretrendszere kezeli az összevont biztonsági kommunikációs minta korábban említett lépéseit, és lehetővé teszi az ügyfél számára a szolgáltatás zökkenőmentes használatát.

Minta implementáció a WCF használatával

Az alábbi ábra egy összevont biztonsági architektúra mintáját mutatja be a WCF natív támogatásával.

Diagram showing a sample Federation security implementation.

MyService példa

A szolgáltatás MyService egyetlen végpontot tesz elérhetővé a MyServiceEndpoint. Az alábbi ábrán a végponthoz társított cím, kötés és szerződés látható.

Diagram showing the MyServiceEndpoint details.

A szolgáltatásvégpont MyServiceEndpoint a <wsFederationHttpBinding> szolgáltatást használja, és érvényes biztonsági helyességi korrektúranyelvi (SAML) jogkivonatot igényel az accessAuthorized STS B által kiadott jogcímmel. Ez deklaratív módon van megadva a szolgáltatáskonfigurációban.

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

Feljegyzés

A szükséges MyServicejogcímekkel kapcsolatban finom pontot kell megjegyezni. A második ábra azt jelzi, hogy MyService a jogcímhez accessAuthorized SAML-jogkivonat szükséges. Pontosabban ez határozza meg a szükséges jogcímtípust MyService . Ennek a jogcímtípusnak http://tempuri.org:accessAuthorized a teljes neve (a társított névtérrel együtt) a szolgáltatáskonfigurációs fájlban használatos. Ennek a jogcímnek az értéke jelzi ennek a jogcímnek a jelenlétét, és feltételezzük, hogy true az STS B állítja be.

Futásidőben ezt a szabályzatot az MyServiceOperationRequirement osztály kényszeríti ki, amely a 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

Az alábbi ábrán az STS B látható. Ahogy korábban említettük, a biztonsági jogkivonat-szolgáltatás (STS) is webszolgáltatás, és rendelkezhet a kapcsolódó végpontokkal, szabályzatokkal stb.

Diagram showing security token service B.

Az STS B egyetlen végpontot tesz elérhetővé, amelyet STSEndpoint biztonsági jogkivonatok lekérésére lehet használni. Az STS B saml-jogkivonatokat ad ki a accessAuthorized jogcímhez, amelyeket a MyService szolgáltatáswebhelyen jeleníthet meg a szolgáltatás eléréséhez. Az STS B azonban megköveteli, hogy a felhasználók egy érvényes SAML-jogkivonatot mutassanak be, amelyet az STS A állít ki, amely tartalmazza a jogcímet userAuthenticated . Ez deklaratív módon van megadva az STS-konfigurációban.

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

Feljegyzés

A jogcím ismét az userAuthenticated STS B által megkövetelt jogcímtípus. Ennek a jogcímtípusnak http://tempuri.org:userAuthenticated a teljes neve (a társított névtérrel együtt) az STS konfigurációs fájlban használatos. A jogcím értéke a jogcím meglétét jelzi, és feltételezzük, hogy true az STS A értékre van állítva.

Futásidőben az osztály kikényszeríti ezt a STS_B_OperationRequirement szabályzatot, amely az STS B részeként van implementálva.

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

Ha a hozzáférés-ellenőrzés egyértelmű, az STS B egy SAML-jogkivonatot ad ki a accessAuthorized jogcímhez.

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

Az alábbi ábrán az STS A látható.

Federation

Az STS B-hez hasonlóan az STS A is egy webszolgáltatás, amely biztonsági jogkivonatokat ad ki, és egyetlen végpontot tesz elérhetővé erre a célra. Azonban egy másik kötést (wsHttpBinding) használ, és megköveteli a felhasználóktól, hogy érvényes CardSpace-t mutassanak be egy emailAddress jogcímmel. Válaszul SAML-jogkivonatokat ad ki a userAuthenticated jogcímhez. Ez deklaratív módon van megadva a szolgáltatáskonfigurációban.

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

Futásidőben az osztály kikényszeríti ezt a STS_A_OperationRequirement szabályzatot, amely az STS A részeként van implementálva.


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

Ha a hozzáférés az, az trueSTS A egy SAML-jogkivonatot ad ki a jogcímhez userAuthenticated .

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

Ügyfél az A szervezetnél

Az alábbi ábrán az A szervezet ügyfele látható, valamint a szolgáltatáshívások végrehajtásának MyService lépéseit. A többi funkcionális összetevőt is tartalmazza a teljesség érdekében.

Diagram showing the steps in a MyService service call.

Összegzés

Az összevont biztonság a felelősség tiszta felosztását biztosítja, és segít a biztonságos, méretezhető szolgáltatásarchitektúrák kialakításában. Az elosztott alkalmazások létrehozására és üzembe helyezésére szolgáló platformként a WCF natív támogatást nyújt az összevont biztonság megvalósításához.

Lásd még