Nasıl yapılır: Bir Hizmet için Özel Yetkilendirme Yöneticisi Oluşturma
Windows Communication Foundation'daki (WCF) Kimlik Modeli altyapısı, genişletilebilir talep tabanlı yetkilendirme modelini destekler. Talepler belirteçlerden ayıklanır ve isteğe bağlı olarak özel yetkilendirme ilkeleri tarafından işlenir ve sonra içine AuthorizationContextyerleştirilir. Yetkilendirme yöneticisi, yetkilendirme kararları almak için içindeki AuthorizationContext talepleri inceler.
Varsayılan olarak, yetkilendirme kararları sınıfı tarafından ServiceAuthorizationManager yapılır; ancak bu kararlar özel yetkilendirme yöneticisi oluşturularak geçersiz kılınabilir. Özel yetkilendirme yöneticisi oluşturmak için, yönteminden ServiceAuthorizationManager türetilen ve uygulayan CheckAccessCore bir sınıf oluşturun. Yetkilendirme kararları yönteminde CheckAccessCore verilir ve bu, erişim verildiğinde ve false
erişim reddedildiğinde döndürürtrue
.
Yetkilendirme kararı ileti gövdesinin içeriğine bağlıysa yöntemini kullanın CheckAccess .
Performans sorunları nedeniyle, mümkünse, yetkilendirme kararının ileti gövdesine erişim gerektirmemesi için uygulamanızı yeniden tasarlamanız gerekir.
Bir hizmet için özel yetkilendirme yöneticisinin kaydı kod veya yapılandırmada yapılabilir.
Özel yetkilendirme yöneticisi oluşturmak için
sınıfından bir sınıf türet.ServiceAuthorizationManager
public class MyServiceAuthorizationManager : ServiceAuthorizationManager {
Public Class MyServiceAuthorizationManager Inherits ServiceAuthorizationManager
CheckAccessCore(OperationContext) yöntemini geçersiz kılın.
OperationContext Yetkilendirme kararları almak için yöntemine CheckAccessCore(OperationContext) geçirilen öğesini kullanın.
Aşağıdaki kod örneği, yetkilendirme kararı vermek için özel talebi
http://www.contoso.com/claims/allowedoperation
bulmak için yöntemini kullanırFindClaims(String, String).protected override bool CheckAccessCore(OperationContext operationContext) { // Extract the action URI from the OperationContext. Match this against the claims // in the AuthorizationContext. string action = operationContext.RequestContext.RequestMessage.Headers.Action; // Iterate through the various claim sets in the AuthorizationContext. foreach(ClaimSet cs in operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets) { // Examine only those claim sets issued by System. if (cs.Issuer == ClaimSet.System) { // Iterate through claims of type "http://www.contoso.com/claims/allowedoperation". foreach (Claim c in cs.FindClaims("http://www.contoso.com/claims/allowedoperation", Rights.PossessProperty)) { // If the Claim resource matches the action URI then return true to allow access. if (action == c.Resource.ToString()) return true; } } } // If this point is reached, return false to deny access. return false; }
Protected Overrides Function CheckAccessCore(ByVal operationContext As OperationContext) As Boolean ' Extract the action URI from the OperationContext. Match this against the claims. ' in the AuthorizationContext. Dim action As String = operationContext.RequestContext.RequestMessage.Headers.Action ' Iterate through the various claimsets in the AuthorizationContext. Dim cs As ClaimSet For Each cs In operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets ' Examine only those claim sets issued by System. If cs.Issuer Is ClaimSet.System Then ' Iterate through claims of type "http://www.contoso.com/claims/allowedoperation". Dim c As Claim For Each c In cs.FindClaims("http://www.contoso.com/claims/allowedoperation", _ Rights.PossessProperty) ' If the Claim resource matches the action URI then return true to allow access. If action = c.Resource.ToString() Then Return True End If Next c End If Next cs ' If this point is reached, return false to deny access. Return False End Function
Kod kullanarak özel yetkilendirme yöneticisi kaydetmek için
Özel yetkilendirme yöneticisinin bir örneğini oluşturun ve özelliğine atayın ServiceAuthorizationManager .
ServiceAuthorizationBehavior özelliği kullanılarak Authorization erişilebilir.
Aşağıdaki kod örneği özel yetkilendirme yöneticisini
MyServiceAuthorizationManager
kaydeder.// Add a custom authorization manager to the service authorization behavior. serviceHost.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager();
' Add a custom authorization manager to the service authorization behavior. serviceHost.Authorization.ServiceAuthorizationManager = _ New MyServiceAuthorizationManager()
Yapılandırma kullanarak özel yetkilendirme yöneticisi kaydetmek için
Hizmetin yapılandırma dosyasını açın.
Davranışlara>< serviceAuthorization>< ekleyin.
serviceAuthorization'a ><bir
serviceAuthorizationManagerType
öznitelik ekleyin ve değerini özel yetkilendirme yöneticisini temsil eden türe ayarlayın.İstemci ve hizmet arasındaki iletişimin güvenliğini sağlayan bir bağlama ekleyin.
Bu iletişim için seçilen bağlama, özel yetkilendirme yöneticisinin yetkilendirme kararları almak için kullandığı öğesine eklenen AuthorizationContexttalepleri belirler. Sistem tarafından sağlanan bağlamalar hakkında daha fazla bilgi için bkz . Sistem Tarafından Sağlanan Bağlamalar.
Bir hizmet öğesi ekleyerek davranışı bir <hizmet> uç noktasıyla ilişkilendirin ve özniteliğin
behaviorConfiguration
değerini davranış> öğesinin name özniteliğinin <değerine ayarlayın.Hizmet uç noktasını yapılandırma hakkında daha fazla bilgi için bkz . Nasıl yapılır: Yapılandırmada Hizmet Uç Noktası Oluşturma.
Aşağıdaki kod örneği özel yetkilendirme yöneticisini
Samples.MyServiceAuthorizationManager
kaydeder.<configuration> <system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:8000/ServiceModelSamples/service"/> </baseAddresses> </host> <endpoint address="" binding="wsHttpBinding_Calculator" contract="Microsoft.ServiceModel.Samples.ICalculator" /> </service> </services> <bindings> <WSHttpBinding> <binding name = "wsHttpBinding_Calculator"> <security mode="Message"> <message clientCredentialType="Windows"/> </security> </binding> </WSHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="CalculatorServiceBehavior"> <serviceAuthorization serviceAuthorizationManagerType="Samples.MyServiceAuthorizationManager,MyAssembly" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
Uyarı
serviceAuthorizationManagerType değerini belirttiğinizde dizenin tam tür adını içermesi gerektiğini unutmayın. virgül ve türün tanımlandığı derlemenin adı. Derleme adını atlarsanız, WCF türü System.ServiceModel.dll yüklemeyi dener.
Örnek
Aşağıdaki kod örneği, yöntemini geçersiz kılmayı içeren bir ServiceAuthorizationManager sınıfın CheckAccessCore temel uygulamasını gösterir. Örnek kod, özel talep için öğesini AuthorizationContext inceler ve bu özel talebin kaynağından gelen OperationContexteylem değeriyle eşleştiğinde döndürürtrue
. Bir sınıfın daha eksiksiz bir ServiceAuthorizationManager uygulaması için bkz . Yetkilendirme İlkesi.
public class MyServiceAuthorizationManager : ServiceAuthorizationManager
{
protected override bool CheckAccessCore(OperationContext operationContext)
{
// Extract the action URI from the OperationContext. Match this against the claims
// in the AuthorizationContext.
string action = operationContext.RequestContext.RequestMessage.Headers.Action;
// Iterate through the various claim sets in the AuthorizationContext.
foreach(ClaimSet cs in operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets)
{
// Examine only those claim sets issued by System.
if (cs.Issuer == ClaimSet.System)
{
// Iterate through claims of type "http://www.contoso.com/claims/allowedoperation".
foreach (Claim c in cs.FindClaims("http://www.contoso.com/claims/allowedoperation", Rights.PossessProperty))
{
// If the Claim resource matches the action URI then return true to allow access.
if (action == c.Resource.ToString())
return true;
}
}
}
// If this point is reached, return false to deny access.
return false;
}
}
Public Class MyServiceAuthorizationManager
Inherits ServiceAuthorizationManager
Protected Overrides Function CheckAccessCore(ByVal operationContext As OperationContext) As Boolean
' Extract the action URI from the OperationContext. Match this against the claims.
' in the AuthorizationContext.
Dim action As String = operationContext.RequestContext.RequestMessage.Headers.Action
' Iterate through the various claimsets in the AuthorizationContext.
Dim cs As ClaimSet
For Each cs In operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets
' Examine only those claim sets issued by System.
If cs.Issuer Is ClaimSet.System Then
' Iterate through claims of type "http://www.contoso.com/claims/allowedoperation".
Dim c As Claim
For Each c In cs.FindClaims("http://www.contoso.com/claims/allowedoperation", _
Rights.PossessProperty)
' If the Claim resource matches the action URI then return true to allow access.
If action = c.Resource.ToString() Then
Return True
End If
Next c
End If
Next cs
' If this point is reached, return false to deny access.
Return False
End Function
End Class