2016-07-15 29 views
0

我想在單個控制器動作而不是全局應用程序中使用Windows集成身份驗證。我已經在網上閱讀了很多文章和StackOverflow,但還沒有找到答案。 請注意,我正在開發Web API 2.0而不是MVC。身份驗證使用Windows身份驗證上一個動作,而不是整個應用程序

也就是說,通常在您的整個應用程序啓用Windows身份驗證,你會做這樣的事情Web API documentation describes

<system.web> 
    <authentication mode="Windows" /> 
</system.web> 

在幕後,我不知道這是什麼一樣準確,但我有懷疑我可能能夠通過執行IAuthenticationFilter作爲described by Web API documentation在單個控制器動作上覆制它。但是,我還沒有找到確切的文章解釋如何做到這一點的Windows集成身份驗證。我的目標

例子:

在一天結束的時候,我想我的單個Web API,以接受來自配置爲使用Windows身份驗證在以下任一客戶端方案的客戶端的請求:

C#

var handler = new HttpClientHandler() 
{ 
    UseDefaultCredentials = true 
}; 

var client = new HttpClient(handler); 

瀏覽器

$.ajax({ 
    url: 'api/testauthentication', 
    type: 'GET', 
    dataType: 'json', 
    xhrFields: { 
     withCredentials: true 
    } 
}) 

編輯#1

它已經到了我的注意,這是值得注意的,我想通過配置文件,如web.config中編程,而不是完成以上,IIS設置等。此外,我在我的服務器上使用了OWIN to host這個應用程序。

+0

你的意思認證或授權?恕我直言。您**在應用程序級驗證**並**授權**每種方法。 –

+0

Gotcha。聽起來好像你描述的是真的,那麼我所追求的是不可能的。我希望認證和不授權。 –

回答

1

答案基於此MSDN article覆蓋HttpClient的認證計算器後。

本質上講,你可以定義指定哪個請求使用集成Windows身份驗證來驗證一個自定義的委託方法。

在下面的代碼builder指OWIN自託管的「啓動」代碼中使用的IAppBuilder實例。有關此相關主題的更多詳細信息,請參閱OWIN self-host article

OwinHttpListener httpListener = (OwinHttpListener)builder.Properties[typeof(OwinHttpListener).FullName]; 
httpListener.Listener.AuthenticationSchemeSelectorDelegate = new AuthenticationSchemeSelector(DetermineAuthenticationScheme); 

然後定義類似於以下DetermineAuthenticationScheme委託方法:

AuthenticationSchemes DetermineAuthenticationScheme(HttpListenerRequest request) 
{ 
    if (request == null) 
    { 
     throw new ArgumentNullException("request"); 
    } 

    if (request.RawUrl.IndexOf("v1/foo", StringComparison.OrdinalIgnoreCase) >= 0) 
    { 
     return AuthenticationSchemes.IntegratedWindowsAuthentication; 
    } 

    return AuthenticationSchemes.Anonymous; 
} 
-2

你見過以下帖子嗎? http://www.scip.be/index.php?Page=ArticlesNET38。這似乎是相當一步一步。你沒有提到你是否已經部署了這個,或者在通過Visual Studio運行的IIS Express中有這個功能,但是突出給我的一個部分是在IIS配置中的「我的文檔\ IISExpress \ config

它出現這種解決方案
<windowsAuthentication enabled="true"> 

注意只涵蓋你的問題的基於瀏覽器的部分。對於基於非瀏覽器的部分,我假設你將不得不讓應用程序收到401響應。

看起來已經有使用本地Windows憑據

How to get HttpClient to pass credentials along with the request?

+0

我不明白這是如何解決要求在單個API上進行驗證的問題,而不是整個應用程序。 –

+0

你一定不知道web api那麼好。您使用[authorize]屬性修飾控制器操作。其他不需要授權的行爲應該廣泛開放。 – Bill

+0

不幸的是,你提出的解決方案要求每個服務請求都有一個授權頭;否則,未經授權的回覆將被返回給客戶端。我的目標是隻驗證問題中所述的單個控制器操作的授權標頭。謝謝。 –

相關問題