我正在实施一个3层应用程序。我使用WCF作为我的服务/ BLL层。在调用服务时,我的身份验证允许某个域帐户访问,以防止不需要的流量,并且每个应用程序只维护一个帐户
除此之外,我还想审核正在执行操作的应用程序的最终用户。
例如,我的应用用户,让我们给他打电话,更新采购订单。应用程序使用特定于该应用程序的用户标识/密码调用我的服务中的UpdatePO()方法。该应用已获得授权。现在可以进行更新。执行更新时,我需要验证Bob是否可以执行操作并将其记录到我的数据库中。
几乎所有更新服务调用甚至一些读取调用都需要这样做。如果可能的话,我不想为每个方法传递参数。 有没有办法将第二组凭据传递给将用作我的审核凭证的服务?
我不希望维护一个组将所有可以调用该服务的用户。服务授权本身和服务帐户的维护必须保持在最低限度。
答案 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。