2011-12-13 39 views
1

我正在學習和設計一個WCF服務。我選擇使用Windows憑據作爲身份驗證方法,並且我已經正確配置了它,希望能夠這樣做,因爲當我測試託管在本地計算機上的服務時,可以從事件日誌查看器中查看身份驗證審覈日誌。如何控制WCF身份驗證會拒絕哪些內容?

但是現在我想出了這個奇怪的問題:在這種配置下哪些用戶不會被認證?我的服務是否對同一個Windows域中的所有Windows用戶進行身份驗證,或者我可以指定域中的哪些特定用戶將不會得到身份驗證?

或者,這是否意味着我只能控制哪些用戶(在我的域中)可以執行我的服務通過授權(我知道該怎麼做)提供的操作?

聽起來很簡單,但我發現的所有材料只告訴你如何執行身份驗證,並沒有說如何拒絕身份驗證請求。

更新: 閱讀@syneptody的答案後,我仍然有兩個問題:

  1. 我必須說我的身份驗證和授權之間的混亂仍然存在。認證手段識別用戶。但是,如果我想告訴屬於與服務主機相同的域的用戶(順便說一句,它是IIS),誰只是向我的服務發出請求,「您沒有通過身份驗證」,我應該說的是「我做你的身份驗證,但你沒有授權(執行你的請求)「,是嗎?對於我的域中的用戶沒有「未經身份驗證」狀態?如果不屬於我的域的用戶提出請求會怎麼樣?我的服務會告訴他「你沒有被認證」或「你沒有被授權」?只要此用戶具有身份,該服務就會對其進行身份驗證,並繼續調查是否應該授權該服務。
  2. @syneptody提到這個「授權」元素。它屬於ASP.NET,它指定哪些角色可以/不能訪問資源(無論是網站還是託管在網站中的應用程序,具體取決於它所在的Web.config文件)。這樣對嗎?但是如果我不使用ASP.NET或不以ASP.NET兼容模式託管WCF,它仍然可以像那樣工作嗎?其實我們的要求是隻提供服務,所以我沒有想到使用ASP.NET,因爲在我看來,它更像是一個消費我的服務的Web客戶端。 順便說一句,我的使用場景是這個服務將在Intranet內託管和使用。所以我選擇Windows憑據進行身份驗證,選擇Windows組進行基於角色的授權,因爲在我看來,這需要最少的工作。
+0

爲了解決問題1,請記住AD認證用戶和IIS的授權請求。在Windows域中,世界認證總是由域控制器完成。所以401會像你沒有被認證,例如匿名,並且此資源需要經過身份驗證的用戶。 403將是你的身份驗證,但未經授權。 – syneptody 2011-12-14 13:14:41

+0

要解決問題2,建議的解決方案確實需要ASP.NET兼容模式。我不以這種或那種方式寬容......我只是將它作爲一種方法提供,因爲它是迄今爲止最容易實施的方法。 WCF中的安全性是一個非常龐大而複雜的主題,有幾種方法可以做到。如果您的解決方案可以採用兼容模式(並且我的經驗是大多數企業服務可以),那麼這種方法可能適用於您。 – syneptody 2011-12-14 13:16:51

回答

1

這篇文章請看: http://msdn.microsoft.com/en-us/library/aa702682.aspx

它做了很好的工作解釋WCF和ASP.NET之間的連接。如果您能夠在ASP.NET兼容模式下運行服務,則可以使用ASP.NET授權規則。在您可以利用集成身份驗證的域環境中,沒有更簡單的方法來爲您的服務提供授權。

服務實現:

[AspNetCompatibilityRequirements(RequirementsMode AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceBehavior] 
public class Foo { ... } 

然後在您的配置:

<system.web> 
    <authorization> 
     <allow users="?" /> 
     <allow roles="DOMAIN_SECURITY_GROUP" /> 
     <deny users="*" /> 
    </authorization> 

    <authentication mode="Windows" /> 
    <identity impersonate="false" /> 
    </system.web>