2010-11-04 59 views
1

我試圖打我的Intranet網站,並得到它作爲我登錄的Windows用戶運行一個簡單的SQL查詢。Windows身份驗證不與ASP.NET網頁工作

當我通過Visual Studio進行調試時,一切正常。當我點擊網絡服務器時,出現sqlconnection錯誤,說:「錯誤:用戶'YOUR_DOMAIN \ YOUR_WEBSERVER_NAME'登錄失敗。」

Request.ServerVariables[AUTH_USER]: YOUR_DOMAIN\UserBob 
System.Security.Principal.WindowsIdentity.GetCurrent().Name: NT AUTHORITY\NETWORK SERVICE 
Page.User.Identity.Name: YOUR_DOMAIN\UserBob 
System.Threading.Thread.CurrentPrincipal.Identity.Name: YOUR_DOMAIN\UserBob 

那麼如何獲得在UserBob下執行的SQL查詢?

這裏是我的設置:

<system.web> 
    <compilation debug="true" targetFramework="4.0"/> 
    <authentication mode="Windows"/> 
    <identity impersonate="true"/> 
    <customErrors mode="Off"/> 
    </system.web> 

Web服務器是一個雙贏2008服務器IIS7,Windows身份驗證時,匿名身份驗證關閉。

代碼很簡單:

Response.Write("Request.ServerVariables[AUTH_USER]: " + Request.ServerVariables ["AUTH_USER"].ToString()); 
Response.Write("<br>System.Security.Principal.WindowsIdentity.GetCurrent().Name: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name); 
Response.Write("<br>Page.User.Identity.Name: " + Page.User.Identity.Name); 
Response.Write("<br>System.Threading.Thread.CurrentPrincipal.Identity.Name: " + System.Threading.Thread.CurrentPrincipal.Identity.Name); 

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["CarbonDB"].ConnectionString); 

conn.Open(); 

SqlCommand sqlcom = new SqlCommand("dbo.runsomething", conn); 
sqlcom.CommandType = CommandType.StoredProcedure; 
SqlDataReader sqlDataReader = sqlcom.ExecuteReader(); 

conn.Close(); 

回答

0

是使用集成或經典管道模式的網站。在IIS7中,檢查網站的基本設置,點擊連接爲...並確保選中Application用戶(傳遞身份驗證)。

+0

應用程序池是集成管道。是的,傳遞身份驗證被檢查。 – Dakhath 2010-11-04 23:04:12

1

SQL Server與Web服務器在不同的計算機上嗎?

如果是這樣,您遇到的問題與Kerberos委派相關。基本上,您的Web服務器不具備將最終用戶模擬到另一臺服務器的權限。

Try this link for more information on delegation.

請注意,這不是小事,需要從網絡管理員的幫助,因爲它涉及到更改您的Active Directory環境。

如果可能,請使用服務帳戶(如網絡服務)訪問SQL Server。

Erick

+0

SQL Server在不同的機器上。事情是,如果我將身份驗證設置爲ASP.NET模擬並對自己的信譽進行硬編碼,那麼當我從我的桌面啓動網絡服務器時,它就會工作。這還算不算? – Dakhath 2010-11-04 23:08:01

+0

如果你硬編碼自己的信用,那麼你不再做多跳(即委託),你直接從一臺機器連接到另一臺機器(IIS到SQL)。問題是,如果你使用集成安全,信用實際上是從瀏覽器流出,而不是從服務器流出。 – 2010-11-05 18:29:34

+0

週一我會看看這個。謝謝! – Dakhath 2010-11-06 04:10:18