![](/img/trans.png)
[英]ASP.NET Windows Authentication + server always getting anonymous user
[英]Getting windows/domain credentials in asp.net while allowing anonymous access in IIS
我在我們的數據中心運行了一個asp.NET webapplication,我們希望客戶通過單點登錄進行登錄。 如果我們可以使用IIS集成安全性,這將非常容易。 但是我們不能這樣做。 我們對客戶的域控制器沒有信任。 我們希望網站可用於一般互聯網。 只有當人們從客戶網絡中連接時,他們才會自動登錄。
我們擁有的是域帳戶列表以及在asp.net代碼中通過LDAP查詢DC的方法。 在IIS中允許匿名訪問時,IIS永遠不會向瀏覽器挑戰憑據。 因此我們的應用程序永遠不會獲得用戶憑據。
有沒有辦法強制瀏覽器發送憑據(因此能夠使用單點登錄)與IIS接受匿名請求。
更新:
我嘗試自己發送401:未經授權,www-authenticate:NTLM標頭。 接下來發生的事情(正如Fiddler告訴我的那樣)是IIS完全控制並處理完整的請求鏈。 據我從各種來源了解,IIS采用用戶名,將挑戰發送回瀏覽器。 瀏覽器返回加密響應,IIS連接到域控制器以使用此響應對用戶進行身份驗證。
但是在我的方案中,IIS與客戶端位於不同的Windows域中,無法對用戶進行身份驗證。 因此,建立一個帶有Windows身份驗證功能的獨立站點也無法正常工作。
現在我需要選擇我正在研究的選項:
您要求的是混合模式身份驗證。 我最近使用了Paul Glavich的兩個入口點機制 ,它完美無缺。 我想這是解決這個問題最優雅的解決方案。
不確定你是否能輕松實現這一目標。 與401挑戰發生在用戶請求的帶內基本不同 - 這樣,信用證出現在標題中,NTLM握手在一個單獨的端口上完成 - 然后由非托管代碼強制進入線程上下文。
你試圖拆開VS2008(或反射器)中的ASP.NET NTLM模塊,看看它是如何提取信用卡的?
不是真的答案 - 對不起......
此解決方案是關於表單身份驗證,但它詳細說明了401問題。
解決方案只是通過將以下內容放在Global.asax中來將處理程序附加到Application的EndRequest事件:
protected void Application_EndRequest(object sender, EventArgs e) {
if (Context.Items["Send401"] != null)
{
Response.StatusCode = 401;
Response.StatusDescription = "Unauthorized";
} }
然后,為了觸發此代碼,您所要做的就是放一個
Context.Items["Send401"] = true;
編輯:
我已經使用此方法打開Anonymous和Integrated來獲取用戶的域憑據。 我不確定它是否適用於你的情況,但我認為我值得一試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.