Ö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:
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 issuerAddress
issuerMetadataAddress
. 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.
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ó.
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 MyService
jogcí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.
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ó.
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 true
STS 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.
Ö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.