2011-03-21 69 views
0

我有一个实现了IAuthorizationPolicy的类。我基于拥有我所有基础级别角色的登录用户(我也使用声明完成了此操作)设置了一个自定义Principal对象。现在我想根据作为消息参数传入的键值更改特定主体的角色。通过方法改变WCF安全角色/声明参数

我遇到的问题是请求消息无法在授权策略类中读取,因为我无权将消息写回请求上下文。我可以使用CheckAccess方法的重写复制并读取ServiceAuthorizationManager派生类中的消息。但是,我必须确保在执行此操作之前已经调用了GetAuthorizationPolicies方法。

我在寻找关于如何根据消息是否包含特定参数来改变委托人角色的建议。基本上,当评估呼吁我想这样做的策略方法ID:

string myObjectId = null; 

if (!messageCopy.IsEmpty) 
{ 
    System.Xml.XmlDictionaryReader xdr = messageCopy.GetReaderAtBodyContents(); 
    xdr.ReadToDecendant("objectId"); 
    if (xdr.Read()) 
    { 
     myObjectId = xdr.ReadContentAsString(); 
    } 
    xdr.Close(); 
} 
messageCopy.Close(); 

ClaimSet claims = (myObjectId != null) ? 
    MapClaims(identity, myObjectId) : MapClaims(identity); 

DefaultPrincipal principal = new DefaultPrincipal(identity, claims); 

回答

0

尝试失败的一整天后,我放弃了试图读取邮件正文和使用更简单的方法,添加一个SOAP消息头。当调用服务,我现在执行以下操作:

using (new OperationContextScope((IContextChannel)myService)) { 
    OperationContext.Current.OutgoingMessageHeaders.Add(
     MessageHeader.CreateHeader("objectId", "http://tempuri.org/", "object value")); 
    myService.BeginMyOperation(parm, callback, state); 
} 

然后在我的服务授权政策的评估方法,我这样做:

int index = OperationContext.Current.IncomingMessageHeaders.FindHeader(
    "objectId", "http://tempuri.org/"); 

string myObjectId = (index < 0) ? null : 
    OperationContext.Current.IncomingMessageHeaders.GetHeader<string>(index); 

ClaimSet claims = (myObjectId != null) ? 
    MapClaims(identity, myObjectId) : MapClaims(identity); 

DefaultPrincipal principal = new DefaultPrincipal(identity, claims); 
0

我遇到了同样的情况,同时开发的WebAPI的安全,我choosen的下的方法:

  • 方法临危参数创建AuthorizationContext其中它通过参数作为资源要求
  • 我的自定义ClaimsAuthorizationManager然后可以从AuthorizationContext.Resource获取参数并从授权中使用它。