ServiceAuthorizationManager.CheckAccess 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
检查给定操作上下文和可选消息的授权。
重载
CheckAccess(OperationContext) |
检查给定操作上下文的授权。 |
CheckAccess(OperationContext, Message) |
访问所需的消息时,检查给定操作上下文的授权。 |
CheckAccess(OperationContext)
检查给定操作上下文的授权。
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
参数
- operationContext
- OperationContext
返回
如果授予访问权限,则为 true
;否则为 false
。 默认值为 true
。
示例
下面的代码演示如何重写此方法,以强制执行自定义访问控制需求。
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
注解
一般而言,应用程序应该重写 CheckAccessCore 代替这个方法。
如果应用程序为生成的 CheckAccess 关联或引入一组不同的策略,或另外提供一个策略评估(链接)模型,则重写 ServiceSecurityContext。
此方法负责调用 CheckAccessCore。
适用于
CheckAccess(OperationContext, Message)
访问所需的消息时,检查给定操作上下文的授权。
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
参数
- operationContext
- OperationContext
返回
如果授予访问权限,则为 true
;否则为 false
。 默认值为 true
。
示例
下面的代码演示如何重写此方法,以强制执行需要访问消息正文的自定义访问控制需求。
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
注解
一般而言,应用程序应该重写 CheckAccessCore 取代这个方法,这仅在授权决定取决于消息正文的情况下使用。 由于性能问题,如有可能,应重新设计应用程序,使授权决策不需要访问消息正文。
如果应用程序为生成的 和 关联或引入一组不同的策略,或另外提供一个策略评估(链接)模型,则重写此方法。
此方法负责调用 CheckAccessCore。