通过方法参数改变WCF安全角色/声明

时间:2011-03-21 14:42:43

标签: wcf security authorization

我有一个实现IAuthorizationPolicy的类。我根据登录用户设置了一个自定义Principal对象,该用户具有我的所有基本级别角色(我也使用声明来完成此操作)。现在我想根据作为消息参数传入的键值来更改特定主体所具有的角色。

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

我正在寻找有关如何根据消息是否包含特定参数来改变主体角色的建议。基本上,当在策略中调用Evaluate方法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);

2 个答案:

答案 0 :(得分:0)

经过一整天的尝试失败后,我放弃了尝试阅读邮件正文并使用更简单的方法,添加了SOAP邮件头。在调用服务时,我现在执行以下操作:

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

然后在我的服务授权策略的Evaluate方法中,我这样做:

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);

答案 1 :(得分:0)

我在开发WebAPI安全性时遇到了同样的情况,我选择了下一个方法:

  • 接收参数的方法创建AuthorizationContext,它将参数作为资源声明
  • 传递
  • 我的自定义ClaimsAuthorizationManager然后可以从AuthorizationContext.Resource获取参数并从授权中使用它。