2012-01-27 53 views
1

我正在實施3層應用程序。我正在使用WCF作爲我的服務/ BLL層。呼叫服務時,我的身份驗證允許某個域帳戶訪問,以防止不必要的流量,並且只爲每個應用程序維護一個帳戶。使用WCF服務如何審覈應用程序用戶的操作?

除此之外,我還想審覈正在執行操作的應用程序的最終用戶。

例如,我的應用用戶,讓他叫他鮑勃,更新採購訂單。應用程序使用特定於該應用程序的用戶ID /密碼在我的服務中調用UpdatePO()方法。該應用程序已被授權。現在可以進行更新。執行更新時,我需要驗證Bob是否可以執行操作並將其記錄到我的數據庫。

我將需要幾乎所有的更新服務調用,甚至一些讀取調用。如果可能的話,我不想傳遞每個方法的參數。 有沒有辦法將第二套憑證傳遞給將用作我的審計憑證的服務?

我不想維護一個組,將所有可以調用該服務的用戶。服務授權本身和服務帳戶的維護必須保持在最低限度。

回答

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 ... 
    } 
} 
+0

我已經決定使用這種方法。它似乎比其他建議的選項更清潔。謝謝。 – Jay 2012-03-15 13:02:53

0

夫婦建議:


您可以實現在WCF中,它會使用憑據傳遞自己的身份驗證「令牌」,你可以把它包括應用程序和用戶憑據。然而,在WCF中實現自定義安全令牌是一個真正的痛苦......期待它花費幾天時間才能正常工作:)這樣可以讓您更輕鬆地隔離授權和驗證位,而不是將其作爲參數傳遞給每個方法。請參閱this MSDN article


你可以讓你所有的方法都帶1個參數;某種類型的包含用戶憑證的消息基類,並針對每種特定的消息類型對其進行擴展。

在代碼:

[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擴展點,着眼於方法的參數,確保它實現如果確實如此,驗證和審覈憑證。


IMO的第二種方式是多一點「哈克」。在我最新的生產應用程序中,我們執行第一個選項...從客戶端傳遞完整的自定義安全令牌,而不是內置的WCF安全類型。事實上,我有一個冗長的StackOverflow問題,當我遇到問題時,我回來了,here

相關問題