Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Funkcja związana z tożsamością w interfejsie Windows Communication Foundation (WCF) umożliwia klientowi wcześniejsze określenie oczekiwanej tożsamości usługi. Za każdym razem, gdy serwer uwierzytelnia się na kliencie, tożsamość jest sprawdzana względem oczekiwanej tożsamości. (Aby uzyskać wyjaśnienie tożsamości i sposobu jej działania, zobacz Service Identity and Authentication.)
W razie potrzeby weryfikację można dostosować przy użyciu niestandardowego weryfikatora tożsamości. Można na przykład przeprowadzić dodatkowe kontrole weryfikacji tożsamości usługi. W tym przykładzie niestandardowy weryfikator tożsamości sprawdza dodatkowe roszczenia w certyfikacie X.509, który zwrócił serwer. Aby zapoznać się z przykładową aplikacją, zobacz Service Identity Sample.
Aby rozszerzyć klasę EndpointIdentity
Zdefiniuj nową klasę, która pochodzi z klasy EndpointIdentity. W tym przykładzie to rozszerzenie nosi nazwę
OrgEndpointIdentity.Dodaj prywatnych członków oraz właściwości, które będą używane przez rozszerzoną klasę IdentityVerifier do sprawdzania tożsamości na podstawie oświadczeń w tokenie zabezpieczającym zwróconym przez usługę. W tym przykładzie zdefiniowano jedną właściwość: właściwość
OrganizationClaim.public class OrgEndpointIdentity : EndpointIdentity { private string orgClaim; public OrgEndpointIdentity(string orgName) { orgClaim = orgName; } public string OrganizationClaim { get { return orgClaim; } set { orgClaim = value; } } }Public Class OrgEndpointIdentity Inherits EndpointIdentity Private orgClaim As String Public Sub New(ByVal orgName As String) orgClaim = orgName End Sub Public Property OrganizationClaim() As String Get Return orgClaim End Get Set(ByVal value As String) orgClaim = value End Set End Property End Class
Aby rozszerzyć klasę IdentityVerifier
Zdefiniuj nową klasę pochodzącą z IdentityVerifier. W tym przykładzie nazwa rozszerzenia
CustomIdentityVerifier.public class CustomIdentityVerifier : IdentityVerifier { // Code to be added. public override bool CheckAccess(EndpointIdentity identity, AuthorizationContext authContext) { throw new Exception("The method or operation is not implemented."); } public override bool TryGetIdentity(EndpointAddress reference, out EndpointIdentity identity) { throw new Exception("The method or operation is not implemented."); } }Public Class CustomIdentityVerifier Inherits IdentityVerifier ' Code to be added. Public Overrides Function CheckAccess(ByVal identity As EndpointIdentity, _ ByVal authContext As AuthorizationContext) As Boolean Throw New Exception("The method or operation is not implemented.") End Function Public Overrides Function TryGetIdentity(ByVal reference As EndpointAddress, _ <System.Runtime.InteropServices.Out()> ByRef identity As EndpointIdentity) As Boolean Throw New Exception("The method or operation is not implemented.") End Function End ClassZastąp metodę CheckAccess. Metoda określa, czy sprawdzanie tożsamości zakończyło się powodzeniem, czy niepowodzeniem.
Metoda
CheckAccessma dwa parametry. Pierwszy to wystąpienie klasy EndpointIdentity. Drugi to wystąpienie klasy AuthorizationContext.W implementacji metody sprawdź kolekcję oświadczeń zwróconych przez właściwość ClaimSets klasy AuthorizationContext i wykonaj kontrole uwierzytelniania zgodnie z wymaganiami. Ten przykład rozpoczyna się od znalezienia dowolnego oświadczenia o typie "Nazwa wyróżniająca", a następnie porównuje nazwę z rozszerzeniem EndpointIdentity (
OrgEndpointIdentity).public override bool CheckAccess(EndpointIdentity identity, AuthorizationContext authContext) { bool returnvalue = false; foreach (ClaimSet claimset in authContext.ClaimSets) { foreach (Claim claim in claimset) { if (claim.ClaimType == "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname") { X500DistinguishedName name = (X500DistinguishedName)claim.Resource; if (name.Name.Contains(((OrgEndpointIdentity)identity).OrganizationClaim)) { Console.WriteLine($"Claim Type: {claim.ClaimType}"); Console.WriteLine($"Right: {claim.Right}"); Console.WriteLine($"Resource: {claim.Resource}"); Console.WriteLine(); returnvalue = true; } } } } return returnvalue; }Public Overrides Function CheckAccess(ByVal identity As EndpointIdentity, _ ByVal authContext As AuthorizationContext) As Boolean Dim returnvalue = False For Each claimset In authContext.ClaimSets For Each claim In claimset If claim.ClaimType = "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname" Then Dim name = CType(claim.Resource, X500DistinguishedName) If name.Name.Contains((CType(identity, OrgEndpointIdentity)).OrganizationClaim) Then Console.WriteLine("Claim Type: {0}", claim.ClaimType) Console.WriteLine("Right: {0}", claim.Right) Console.WriteLine("Resource: {0}", claim.Resource) Console.WriteLine() returnvalue = True End If End If Next claim Next claimset Return returnvalue End Function
Aby zaimplementować metodę TryGetIdentity
Zaimplementuj metodę TryGetIdentity, która określa, czy wystąpienie klasy EndpointIdentity może zostać zwrócone przez klienta. Infrastruktura WCF najpierw wywołuje implementację metody
TryGetIdentity, aby uzyskać tożsamość usługi z wiadomości. Następnie infrastruktura wywołuje implementacjęCheckAccess, korzystając ze zwróconychEndpointIdentityi AuthorizationContext.W metodzie
TryGetIdentityumieść następujący kod:public override bool TryGetIdentity(EndpointAddress reference, out EndpointIdentity identity) { return IdentityVerifier.CreateDefault().TryGetIdentity(reference, out identity); }Public Overrides Function TryGetIdentity(ByVal reference As EndpointAddress, _ <System.Runtime.InteropServices.Out()> ByRef identity As EndpointIdentity) As Boolean Return IdentityVerifier.CreateDefault().TryGetIdentity(reference, identity) End Function
Aby zaimplementować niestandardowe powiązanie i ustawić niestandardowy weryfikator tożsamości
Utwórz metodę zwracającą obiekt Binding. W tym przykładzie rozpoczyna się tworzenie wystąpienia klasy WSHttpBinding i ustawia tryb zabezpieczeń na Message, a jego ClientCredentialType na None.
Utwórz BindingElementCollection przy użyciu metody CreateBindingElements.
Zwróć SecurityBindingElement z kolekcji i rzutuj ją do zmiennej SymmetricSecurityBindingElement.
Ustaw właściwość IdentityVerifier klasy LocalClientSecuritySettings na nowe wystąpienie utworzonej wcześniej klasy
CustomIdentityVerifier.public static Binding CreateCustomSecurityBinding() { WSHttpBinding binding = new WSHttpBinding(SecurityMode.Message); //Clients are anonymous to the service. binding.Security.Message.ClientCredentialType = MessageCredentialType.None; //Secure conversation is turned off for simplification. If secure conversation is turned on, then //you also need to set the IdentityVerifier on the secureconversation bootstrap binding. binding.Security.Message.EstablishSecurityContext = false; // Get the SecurityBindingElement and cast to a SymmetricSecurityBindingElement to set the IdentityVerifier. BindingElementCollection outputBec = binding.CreateBindingElements(); SymmetricSecurityBindingElement ssbe = (SymmetricSecurityBindingElement)outputBec.Find<SecurityBindingElement>(); //Set the Custom IdentityVerifier. ssbe.LocalClientSettings.IdentityVerifier = new CustomIdentityVerifier(); return new CustomBinding(outputBec); }Public Shared Function CreateCustomSecurityBinding() As Binding Dim binding As New WSHttpBinding(SecurityMode.Message) With binding.Security.Message 'Clients are anonymous to the service. .ClientCredentialType = MessageCredentialType.None 'Secure conversation is turned off for simplification. If secure conversation is turned on, then 'you also need to set the IdentityVerifier on the secureconversation bootstrap binding. .EstablishSecurityContext = False End With ' Get the SecurityBindingElement and cast to a SymmetricSecurityBindingElement to set the IdentityVerifier. Dim outputBec = binding.CreateBindingElements() Dim ssbe = CType(outputBec.Find(Of SecurityBindingElement)(), SymmetricSecurityBindingElement) 'Set the Custom IdentityVerifier. ssbe.LocalClientSettings.IdentityVerifier = New CustomIdentityVerifier() Return New CustomBinding(outputBec) End FunctionZwracane powiązanie niestandardowe służy do tworzenia wystąpienia klienta i klasy. Klient może następnie przeprowadzić niestandardową weryfikację tożsamości usługi, jak pokazano w poniższym kodzie.
using (CalculatorClient client = new CalculatorClient(customSecurityBinding, serviceAddress)) {Using client As New CalculatorClient(customSecurityBinding, serviceAddress)
Przykład 1
W poniższym przykładzie przedstawiono kompletną implementację klasy IdentityVerifier.
class CustomIdentityVerifier : IdentityVerifier
{
public override bool CheckAccess(EndpointIdentity identity, AuthorizationContext authContext)
{
bool returnvalue = false;
foreach (ClaimSet claimset in authContext.ClaimSets)
{
foreach (Claim claim in claimset)
{
if (claim.ClaimType == "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname")
{
X500DistinguishedName name = (X500DistinguishedName)claim.Resource;
if (name.Name.Contains(((OrgEndpointIdentity)identity).OrganizationClaim))
{
Console.WriteLine($"Claim Type: {claim.ClaimType}");
Console.WriteLine($"Right: {claim.Right}");
Console.WriteLine($"Resource: {claim.Resource}");
Console.WriteLine();
returnvalue = true;
}
}
}
}
return returnvalue;
}
public override bool TryGetIdentity(EndpointAddress reference, out EndpointIdentity identity)
{
return IdentityVerifier.CreateDefault().TryGetIdentity(reference, out identity);
}
}
Friend Class CustomIdentityVerifier
Inherits IdentityVerifier
Public Overrides Function CheckAccess(ByVal identity As EndpointIdentity, _
ByVal authContext As AuthorizationContext) As Boolean
Dim returnvalue = False
For Each claimset In authContext.ClaimSets
For Each claim In claimset
If claim.ClaimType = "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname" Then
Dim name = CType(claim.Resource, X500DistinguishedName)
If name.Name.Contains((CType(identity, OrgEndpointIdentity)).OrganizationClaim) Then
Console.WriteLine("Claim Type: {0}", claim.ClaimType)
Console.WriteLine("Right: {0}", claim.Right)
Console.WriteLine("Resource: {0}", claim.Resource)
Console.WriteLine()
returnvalue = True
End If
End If
Next claim
Next claimset
Return returnvalue
End Function
Public Overrides Function TryGetIdentity(ByVal reference As EndpointAddress, _
<System.Runtime.InteropServices.Out()> ByRef identity As EndpointIdentity) As Boolean
Return IdentityVerifier.CreateDefault().TryGetIdentity(reference, identity)
End Function
End Class
Przykład 2
W poniższym przykładzie przedstawiono kompletną implementację klasy EndpointIdentity.
public class OrgEndpointIdentity : EndpointIdentity
{
private string orgClaim;
public OrgEndpointIdentity(string orgName)
{
orgClaim = orgName;
}
public string OrganizationClaim
{
get { return orgClaim; }
set { orgClaim = value; }
}
}
Public Class OrgEndpointIdentity
Inherits EndpointIdentity
Private orgClaim As String
Public Sub New(ByVal orgName As String)
orgClaim = orgName
End Sub
Public Property OrganizationClaim() As String
Get
Return orgClaim
End Get
Set(ByVal value As String)
orgClaim = value
End Set
End Property
End Class