2015-10-18 82 views
6

我有一個ASP.NET 5 MVC 6 Web API項目。大多數API端點都具有[Authorize]屬性,並且在IIS中以及Visual Studio中項目的屬性中都啓用了Windows身份驗證。這一切都可以在beta 7中正常工作。ASP.NET 5 beta 8中的Windows身份驗證支持

但是,在測試版8中,這不起作用。通過一個完全乾淨的項目很容易重現:

  1. 使用ASP.NET 5 Web API模板創建一個新項目。
  2. 獲取項目屬性(而不是解決方案),轉到調試選項卡,啓用Windows身份驗證並禁用匿名。保存更改。
  3. 命中F5並讓它嘗試運行該項目。

結果:

出現了一個錯誤,以確定託管應用程序的DNX進程的進程ID。

  1. 現在回到項目屬性並啓用匿名。保持Windows啓用。保存更改。
  2. 轉到您的控制器並添加[授權]屬性。
  3. F5。

結果:

該項目啓動這段時間,但Web API返回的輸出窗口500通知:

Microsoft.AspNet.Mvc.Controllers.ControllerActionInvoker:警告:過濾器「Microsoft.AspNet.Mvc.Filters.AuthorizeFilter」的請求授權失敗。

該項目在發佈到IIS時也不起作用。

正如測試版8 announcement所述,主機模型已更改,IIS現在將請求傳遞給Kestrel。 Servers page沒有給出任何跡象表明Kestrel支持Windows身份驗證。在測試版8中使用Windows身份驗證工作有一些技巧嗎?

回答

3

這似乎是一個known bug in the Visual Studio debugging tooling when using IIS Express。在修復之前,我發現的唯一解決方法是通過運行WebListener而不是IIS Express進行調試。要進行設置,請在Startup.cs的Configure方法中添加:

// If we're self-hosting, enable integrated authentication (if we're using 
// IIS, this will be done at the IIS configuration level). 
var listener = app.ServerFeatures.Get<WebListener>(); 
if (listener != null) 
{ 
    listener.AuthenticationManager.AuthenticationSchemes = 
     AuthenticationSchemes.NTLM; 
} 

然後在項目中。json添加weblistener cmd如下:

"commands": { 
    "weblistener": "Microsoft.AspNet.Server.WebListener --config hosting.ini", 
    "web": "Microsoft.AspNet.Server.Kestrel" 
}, 

...或類似。然後,如果您使用weblistener配置文件而不是IIS Express(或Web,Kestrel不支持NTLM)進行調試,則應該能夠在解決IIS Express工具錯誤時繼續工作。我相信您需要將Microsoft.AspNet.Server.WebListener添加到您的project.json依賴項以啓用WebListener。

我發現,如果我直接在project.json中更改了「web」命令,Visual Studio會幫助將它更積極地更改回來,因此添加單獨的命令as recommended by the Microsoft team似乎可以讓所有的事情都快樂起來。

+0

這似乎是現在最好的答案,因爲它允許Windows身份驗證實際工作。謝謝! – Bill

+0

沒有問題@Bill - 我需要它能夠在修復工具錯誤時繼續工作,不想因爲這個原因而將我們的代碼移回beta 7! –

+0

@Bill我剛剛更新了答案,稍微使用一個單獨的命令,因爲今天早上,我看到Visual Studio再次進入並將我的「web」命令改回到Kestrel ......這有點急於設置背部! –

1

有一個已知的工具錯誤,可以防止您禁用「匿名身份驗證」:https://github.com/aspnet/Hosting/issues/419

重新啓用它,並且您看到的問題應該消失。

請確保您在早期Configure方法中添加了app.UseIISPlatformHandler();方法:需要解析與IIS流入的令牌對應的Windows標識。

+0

正如我在我的問題提到的,您啓用匿名(離開啓用了Windows),授權給Web API後仍失敗。這確實允許F5啓動該項目,但沒有任何可以對Web API進行身份驗證。但是,我們正在討論這個問題。 :) – Bill

0

而且在web.config中你應該設置forwardWindowsAuthToken =「真」 如:

<httpPlatform processPath="%DNX_PATH%" arguments="%DNX_ARGS%" forwardWindowsAuthToken="true" startupTimeLimit="3600" />