使用WCF服务如何审核应用程序用户的操作?

时间:2012-01-27 15:51:23

标签: .net wcf authentication

我正在实施一个3层应用程序。我使用WCF作为我的服务/ BLL层。在调用服务时,我的身份验证允许某个域帐户访问,以防止不需要的流量,并且每个应用程序只维护一个帐户

除此之外,我还想审核正在执行操作的应用程序的最终用户。

例如,我的应用用户,让我们给他打电话,更新采购订单。应用程序使用特定于该应用程序的用户标识/密码调用我的服务中的UpdatePO()方法。该应用已获得授权。现在可以进行更新。执行更新时,我需要验证Bob是否可以执行操作并将其记录到我的数据库中。

几乎所有更新服务调用甚至一些读取调用都需要这样做。如果可能的话,我不想为每个方法传递参数。 有没有办法将第二组凭据传递给将用作我的审核凭证的服务?

我不希望维护一个组将所有可以调用该服务的用户。服务授权本身和服务帐户的维护必须保持在最低限度。

2 个答案:

答案 0 :(得分:1)

您可以使用MessageHeaders执行此操作。

来自客户

var auditHeader = new MessageHeader<string>("Bob");
var proxy = new MyClient();
using(var contextScope = new OperationContextScope(proxy.InnerChannel)){
  OperationContext.Current.OutgoingMessageHeaders.Add(
                                  auditHeader.GetUntypedHeader("string","System"));
   proxy.MyMethod();
}
proxy.Close();

在服务器

class MyService : IMyContract{
   public void MyMethod()   {
      var who = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>("string","System");
      // use it ...
   }
}

答案 1 :(得分:0)

夫妻建议:


您可以在WCF中实现自己的身份验证'令牌',它将用于传递凭据,您可以让它包括应用程序和用户凭据。然而,在WCF中实现自定义安全令牌是一个真正的痛苦...期望它需要几天才能使其工作:)这将使您更容易隔离授权和身份验证位,而不是将其作为参数传递给每个方法。 / p>

有关实施细节,请参阅this MSDN article


您可以让所有方法都采用1个参数;某种包含用户凭据的Message基类,并为每种特定的消息类型扩展它。

在代码中:

[DataContract]
public class MessageBase {
    [DataMember]
    public string UserName { get; set; }
    [DataMember]
    public string UserPassword { get; set; }
}

[DataContract]
public class UpdatePOMessage : MessageBase {
}

[OperationContract]
public void UpdatePO(UpdatePOMessage message) { /* do work */ }

然后,您可以实现自定义IOperationInvoker或另一个查看方法参数的WCF扩展点,确保它实现MessageBase,如果实现,则验证并审核凭据。


IMO第二种方式更加“hacky”。在我最新的生产应用程序中,我们执行第一个选项...从客户端传递完整的自定义安全令牌,而不是内置的WCF安全类型。事实上,当我遇到问题时,我有一个冗长的StackOverflow问题here