2014-11-14 138 views
0

我正在開發一個應用程序的原型,我們計劃使用WIF 4.5在MVC5中構建應用程序,該應用程序將針對ADFS服務器進行身份驗證。到目前爲止,我的ADFS實現工作正常,但是存在一個要求,允許Intranet上的用戶被動地向某個控制器進行身份驗證,例如管理員控制器,而外部用戶將使用ADFS在主控制器上進行身份驗證。乍一看,我認爲這將是一個簡單的web.config設置,但是現在看起來情況並非如此。.NET MVC5 w/ADFS和Windows身份驗證

ADFS與應用程序不在同一個域中,但我希望Windows身份驗證發生在應用程序分開的域上。

我的問題是,A)這是可能的,還是我想做一些框架無意處理的事情? B)我怎樣才能做到這一點?

我試過的

<location path="Admin"> 
    <system.web> 
    <!--Having this here throws an error--> 
    <authentication mode="Windows"></authentication> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
    </system.web> 
</location>` 

<system.web> 
    <authentication mode="None|Federated|Windows" /> 
    <authorization> 
    <deny users="?" /> 
    </authorization> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5" requestValidationMode="4.5" /> 
</system.web> 

幾個不同的組合看來,如果任何認證正在實施,它始終是ADFS。我使用On-Premises Organizational Authentication Option (ADFS) With ASP.NET in Visual Studio 2013開始使用模板,並使用管理員提供的元數據。因此,我的項目或多或少是一個關於該模板的香草實現,只需一點定製即可使用我從ADFS工作流獲得的用戶對象。

我得到的是當認證模式中的位置節點設置上面引用的錯誤是

它是使用註冊爲allowDefinition =應用程序級別之外「MachineToApplication」的節是錯誤的。此錯誤可能是由於虛擬目錄未被配置爲IIS中的應用程序。

我收集的內容涉及到沒有將我的虛擬目錄設置爲IIS中的應用程序,但這不是所需的結果。此外,當我確實試圖符合這個錯誤時,我仍然沒有認證正常工作。

稍微更詳細些,經過一些修補之後,我發現IISExpress設置(並最終IIS)將實際上需要設置哪些是好的。所以加入

<location path="WebApplication4/Admin"> 
    <system.webServer> 
     <security> 
      <authentication> 
       <windowsAuthentication enabled="true" /> 
       <anonymousAuthentication enabled="false" /> 
      </authentication> 
     </security> 
    </system.webServer> 
</location> 

我對ApplicationHost.config也開始提示用戶名和密碼的瀏覽器,但我也發現,

<system.webServer> 
    <modules> 
     <add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 
     <add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 
    </modules> 
    </system.webServer> 

似乎是什麼最終完全劫持我的身份驗證和強制所有內容都通過ADFS服務器。我可以手動調用ADFS身份驗證的方法,所以我想要做的就是告訴控制器不要使用它,而是使用Windows身份驗證。看起來,如果我只是簡單地評論這些模塊,但是它會破壞我的ADFS工作流程,但是它會在管理控制器上正確使用Windows身份驗證。

回答

1

您無法覆蓋給定位置的身份驗證方法。您的應用程序只能有一種身份驗證方法。

至於Windows身份驗證,只有託管應用程序的服務器與Intranet用戶位於同一個域中時,纔會起作用,除非您在域之間擁有信任。

如果您的Intranet上也有ADFS,則可以在兩個ADFS實例之間建立聯合。然後您可以爲外部/內部用戶完成身份驗證。

對於您的授權規則,您需要使用聲明來訪問管理部分。當用戶通過內部ADFS進行身份驗證時,您需要添加聲明轉換模塊以添加管理員角色聲明,您可以使用該聲明在控制器上設置權限。

正如您所能猜到的,這不是一個實施的簡單解決方案,如果您沒有ADFS,則需要在內部安裝更多的基礎架構。

另一種方法是在您的應用程序中配置您的內部用戶。如果您只需要向少數用戶授予訪問權限,則這可能是一種更簡單的方法。

+0

感謝您的回答,我想這可能就是這樣。我想我只需將內部應用程序拆分爲自己的應用程序並像這樣處理它。 – 2014-11-17 17:51:44

+0

我不相信「您的應用程序只能擁有一種身份驗證方法」的說法屬實。看着這篇博客文章(我還沒有嘗試過)看起來像你可以混合使用ADFS和形式驗證,只要他們不在同一個位置(http://leastprivilege.com/2012/02/02/02/混合形式和令牌認證在單一的ASP網絡應用/) – Bil 2015-06-02 15:29:21

+0

你是對的,你可以在某些方面與一些自定義代碼混合一些認證方案。 ASP.Net不提供這種靈活性,這就是我的意思。 @LazyCoder只想覆蓋位置標記中的「身份驗證」方案,這是不受支持的,您也可以使用不同的身份驗證方案放置web.config。 – 2015-08-25 08:54:21