ServiceAuthorizationManager.CheckAccess Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Kontroluje autorizaci pro daný kontext operace a volitelnou zprávu.
Přetížení
CheckAccess(OperationContext) |
Kontroluje autorizaci daného kontextu operace. |
CheckAccess(OperationContext, Message) |
Kontroluje autorizaci daného kontextu operace, pokud je vyžadován přístup ke zprávě. |
CheckAccess(OperationContext)
Kontroluje autorizaci daného kontextu operace.
public:
virtual bool CheckAccess(System::ServiceModel::OperationContext ^ operationContext);
public virtual bool CheckAccess (System.ServiceModel.OperationContext operationContext);
abstract member CheckAccess : System.ServiceModel.OperationContext -> bool
override this.CheckAccess : System.ServiceModel.OperationContext -> bool
Public Overridable Function CheckAccess (operationContext As OperationContext) As Boolean
Parametry
- operationContext
- OperationContext
Hodnota OperationContext
Návraty
true
pokud je udělen přístup; v opačném případě . false
Výchozí formát je true
.
Příklady
Následující kód ukazuje, jak tuto metodu přepsat a vynutit vlastní požadavky na řízení přístupu.
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
Poznámky
Obecně platí, že aplikace by místo této metody měly přepsat CheckAccessCore .
Přepište CheckAccess , pokud aplikace přidruží nebo zavádí jinou sadu zásad pro výsledný ServiceSecurityContext nebo poskytuje jiný model vyhodnocení zásad (řetězení).
Tato metoda zodpovídá za volání CheckAccessCore.
Platí pro
CheckAccess(OperationContext, Message)
Kontroluje autorizaci daného kontextu operace, pokud je vyžadován přístup ke zprávě.
public:
virtual bool CheckAccess(System::ServiceModel::OperationContext ^ operationContext, System::ServiceModel::Channels::Message ^ % message);
public virtual bool CheckAccess (System.ServiceModel.OperationContext operationContext, ref System.ServiceModel.Channels.Message message);
abstract member CheckAccess : System.ServiceModel.OperationContext * Message -> bool
override this.CheckAccess : System.ServiceModel.OperationContext * Message -> bool
Public Overridable Function CheckAccess (operationContext As OperationContext, ByRef message As Message) As Boolean
Parametry
- operationContext
- OperationContext
Hodnota OperationContext
Návraty
true
pokud je udělen přístup; v opačném případě . false
Výchozí formát je true
.
Příklady
Následující kód ukazuje, jak tuto metodu přepsat, aby vynucuje vlastní požadavky na řízení přístupu, které vyžadují přístup k textu zprávy.
public class myService_M_AuthorizationManager : ServiceAuthorizationManager
{
// set max size for message
int someMaxSize = 16000;
protected override bool CheckAccessCore(OperationContext operationContext, ref Message message)
{
bool accessAllowed = false;
MessageBuffer requestBuffer = message.CreateBufferedCopy(someMaxSize);
// do access checks using the message parameter value and set accessAllowed appropriately
if (accessAllowed)
{
// replace incoming message with fresh copy since accessing the message consumes it
message = requestBuffer.CreateMessage();
}
return accessAllowed;
}
}
Public Class myService_M_AuthorizationManager
Inherits ServiceAuthorizationManager
' set max size for message
Private someMaxSize As Integer = 16000
Public Overrides Function CheckAccess(ByVal operationContext As OperationContext, _
ByRef message As Message) As Boolean
Dim accessAllowed = False
Dim requestBuffer = Message.CreateBufferedCopy(someMaxSize)
' do access checks using the message parameter value and set accessAllowed appropriately
If accessAllowed Then
' replace incoming message with fresh copy since accessing the message consumes it
Message = requestBuffer.CreateMessage()
End If
Return accessAllowed
End Function
End Class
Poznámky
Obecně platí, že aplikace by místo této metody měly přepsat CheckAccessCore , což by se mělo použít jenom v případě, že rozhodnutí o autorizaci závisí na textu zprávy. Kvůli problémům s výkonem byste měli aplikaci přepracovat tak, aby rozhodnutí o autorizaci nevyžaduje přístup k textu zprávy.
Tuto metodu přepište, pokud aplikace přidruží nebo zavádí jinou sadu zásad pro výslednou ServiceSecurityContext a Message nebo poskytuje jiný model vyhodnocení zásad (řetězení).
Tato metoda zodpovídá za volání CheckAccessCore.