2011-12-06 72 views
9

我正在一個ASP.Net MVC 3應用程序,我有一個用戶表,用於存儲用戶名和密碼。我創建了一個額外的ADUsername(存儲Active Directory的域名/用戶名)。ASP.Net MVC 3登錄和Windows身份驗證

我努力做到以下幾點:

  1. 運行從內聯網應用,用戶不應該看到的登錄頁面。他們的域名/用戶名應自動接收並與ADUsername字段進行比較。

  2. 從互聯網(超出本地網絡)或沒有ADUsername值的用戶運行應用程序的用戶:應該看到登錄屏幕,他們應該使用我的自定義用戶名和密碼字段進行登錄。

此使用Visual Studio開發服務器和很難使用IIS :)

當我把我的web.config中使用的形式,我使用WindowsIdentity.GetCurrent()是很容易的。名稱得到當前的ADUsername然後,我查找我的User表以找到用戶和FormsAuthentication.SetAuthCookie他。

使用IIS總是返回APPPOOL \ ASP.NET v4.0用戶,它不反映我需要的域/用戶。

任何幫助?

+0

還在等一些幫助。如上所述,我需要Forms和Windows身份驗證才能一起工作。 – IoC

回答

15

這不是一件容易的事。只有當啓用了IIS中的Windows身份驗證時,您的Intranet用戶的Windows身份纔會可用,並禁用匿名身份驗證。當用戶的瀏覽器擊中服務器時,IIS將執行NTLM質詢/響應過程來驗證用戶。請注意,這個質詢/響應實際上發生在每個單獨的HTTP請求上,而不僅僅是一次。

此機制的問題在於您的表單身份驗證將不再使用,因爲它在Windows身份驗證運行後啓用,並且未通過身份驗證僅觸發IIS訪問被拒絕 - 不回退到Forms身份驗證。

要構建一個混合體,你將需要:

  1. 設置您的主要的Web應用程序進行身份驗證與Forms身份驗證的用戶。像這樣設置web.config。生成你自己的機器的關鍵 - 這是關鍵,以確保cookie的共享工作

    <authentication mode="Forms"><forms loginUrl="~/Account/LogOn" timeout="2880" path="/" enableCrossAppRedirects="true" name=".ASPXFORMSAUTH" protection="All" /> 
    </authentication> 
    <machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" validation="SHA1" /> <system.webServer> 
    <security> 
        <authentication> 
        <anonymousAuthentication enabled="true"/> 
        <windowsAuthentication enabled="false"/> 
        </authentication> 
    </security></system.webServer> 
    
  2. 創建一個新的,獨立的Web應用程序,以純粹使用NTLM身份驗證。它將授權然後重定向到主應用程序。對不起,這兩個應用程序不能合併。

  3. 在NTLM網絡應用程序中,更改網頁。配置驗證模式象下面這樣:

<authentication mode="Windows">  
    </authentication> 
    <machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" 
       decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" validation="SHA1" /> 
<system.webServer> 
    .... 
    <security> 
     <authentication> 
     <windowsAuthentication enabled="true"/> 
     <anonymousAuthentication enabled="false"/> 
     </authentication> 
     <ipSecurity> 
     <!-- put whatever here to restrict to your LAN 
     <add ..../> 
     --> 
     </ipSecurity> 
    </security> 
    </system.webServer> 
  • 在NTLM的web應用時,控制器也一兩件事 - 從提取的用戶名(WindowsPrincipal)Thread.CurrentPrincipal中();並調用FormsAuthentication.SetAuthCookie(..)。然後重定向到主Web應用程序。不要使用WindowsIdentity.GetCurrent(),因爲如果未啓用模擬,它將不準確[請參閱msdn.microsoft.com/en-us/library/ff647076.aspx]

  • 您無法在卡西尼或IIS Express下測試此任何內容;您必須使用IIS 7.5。

  • 轉到IIS 7.5並打開「身份驗證 - 匿名」和「身份驗證 - Windows」的功能委派。

  • 爲您的基於表單的應用

  • IIS應用程序右鍵單擊新創建的窗體應用程序和「添加應用」。設置路徑的NTLM身份驗證的應用程序,名稱類似「IntranetAuthentication」

  • 在窗體身份驗證的瀏覽器訪問http://localhost/YourSite,並http://localhost/YourSite/IntranetAuthentication看到NTLM身份驗證,然後中繼身份驗證工作回主站點

  • 在您的公司,直接內部網用戶使用Intranet登錄。外部每個人都使用常規表單認證頁面。

    +0

    我需要非常小的樣本。你可以幫我嗎? – IoC

    +0

    在這裏發佈解決方案涉及太多,我已經在這裏爲您提供了一個工作示例https://bitbucket.org/geoffreys/so-dual-win-forms-auth/ – geoffreys

    +0

    該死的剛剛注意到只有一半的解決方案承諾。對不起將提交休息明天 - 他們應該得到你在正確的軌道 – geoffreys

    3

    如果您使用混合身份驗證,爲什麼不通過上下文獲取AD用戶?

    context.Request.ServerVariables["LOGON_USER"] 
    
    +0

    不返回任何值! – IoC

    +0

    我相信IIS配置有問題。請確保在您的網站上關閉匿名身份驗證,並打開Windows身份驗證,如果您想擁有AD身份驗證。 –