2012-10-22 59 views
3

我已經繼承了一個使用表單身份驗證的項目,但最近的功能請求要求我獲取某些用戶的Windows用戶名。使用表單身份驗證獲取Windows用戶名的更好方法?

這是一個使用Forms身份驗證的網站(我不想改變這一點,在這一點上工作太多),但我有一個功能請求,允許我們的內部用戶更容易登錄(通常沒有必須輸入他們的密碼或用戶名)。

我現在的方法是可怕的,它涉及到檢查的IP地址,看看他們是從我們的IP地址的一個連接,如果是這樣,他們重定向到使用Windows身份驗證一個單獨的項目,然後重定向他們回原始頁面與包含他們的用戶名的查詢字符串(如果我被迫留在這個方法中,我可能需要加密,儘管它仍然不像我想的那樣安全)。

我可以在我的應用程序中相對容易地執行Windows身份驗證,但最難的部分是獲取Windows用戶名。我無法弄清楚如何做到這一點,因此我非常醜陋的方法。

任何幫助,將不勝感激。

編輯:我的二次應用只是做這個:

string username = HttpContext.Current.User.Identity.Name; 
string retpath = Request.QueryString["retpath"]; 
Response.Redirect("http://" + retpath + "?id=" + username); 
+0

當前應用程序是否在域中的服務器上運行(或者至少與域具有信任關係)?如果是這樣,至少應該不需要單獨的申請。 –

+0

目前這兩個應用程序都在我們的內部測試服務器上運行。如果我必須運行兩個單獨的項目,我可能會在同一個域上運行這兩個應用程序。 編輯:等等,我可能誤解了這個問題:)。我認爲你的實際問題的答案是肯定的,但我必須檢查。 – Maverick

+0

我的意思是Windows聯網條款中的域名,而不是WWW DNS條款 - 如果您的用戶在DOMAIN5 \ UserName下登錄,您的IIS服務器是否也是DOMAIN5的一部分? –

回答

2

本文包含的答案,請添加引用,(謝謝vinodpthmn):http://msdn.microsoft.com/en-us/library/ms972958.aspx 我在我的研究中發現了這篇文章的鏈接,但沒有一篇米工作!很高興我終於能夠閱讀並解決我的問題。

正如我所提到的,我只需要獲取客戶端的windows用戶名,但結果相當麻煩,幸好實際解決方案相對簡單。

首先,你需要創建一個額外的登錄頁面(我打電話給我winlogin.aspx),並設置在你的web.config文件中的默認登錄頁面,如下所示:

<authentication mode="Forms"> 
     <forms name="something" defaultUrl="default.aspx" loginUrl="winlogin.aspx" protection="All" slidingExpiration="true" timeout="90"/> 
    </authentication> 

的winlogin內.aspx.cs文件是您驗證Windows用戶並使用的地方

FormsAuthentication.RedirectFromLoginPage(username, false/true); 

將其重定向到任何他們要去的地方。實際的winlogin.aspx頁面應該是空白的,用戶永遠不會看到它。

您需要發佈到您的測試網絡服務器以進行下一部分: 您可以在IIS管理器中訪問winlogin.aspx的文件屬性,並將WindowsAuthentication設置爲true,並將匿名身份驗證設置爲false。你還需要創建一個自定義的401錯誤頁面指針(我的指向我的舊Login.aspx頁面)。

可以使用Windows身份驗證登錄的用戶將這樣做,其他人將被重定向到舊的登錄頁面。

瞧!

但是,有一些問題會丟失您的返回URL(您不能在鏈接到自定義401錯誤頁面時使用「=」,因此無法解析任何內容),因此您可能需要設置每當人們被重定向到winlogin頁面,並在表單登錄頁面訪問該cookie以適當地重定向用戶時,就可以使用cookie。

如果有人有任何問題,我建議您閱讀上面鏈接的文章,或者隨時在這裏提問。

謝謝大家的幫助!

+0

如果我在我的域內登錄,但一切正常,但我只是得到401錯誤,它似乎沒有重定向到login.aspx頁面。 ? – TruthOf42

+0

創建一個global.asax文件並捕獲401錯誤並重定向似乎有訣竅:http://forums.asp.net/t/1384705.aspx?Custom+Errors+not+working+for+StatusCodes+ 401 + 403 – TruthOf42

-1

你可以使用目錄服務

PrincipalContext pc = null; 
UserPrincipal principal = null; 
var username = User.Identity.Name; 
pc = new PrincipalContext(ContextType.Domain, "give your domain name here"); 
principal = UserPrincipal.FindByIdentity(pc, userName); 
var firstName = principal.GivenName ?? string.Empty; 
var lastName = principal.Surname ?? string.Empty; 

爲System.DirectoryServices.AccountManagement

+1

感謝您的及時回覆!雖然一些事情:User.Identity.Name實際上並沒有做任何事情雖然,它(你不會再次引用它,它是User.Identity.Name不包含任何東西,直到用戶登錄後)?此外,你是什麼意思的「給這裏的登錄ID」?這聽起來像你需要登錄的人的用戶名,但這正是我想要得到的。抱歉,如果我誤解了:)。 編輯:只是測試了代碼,它做了我認爲它會做的事情,看起來有人起來我已經確定了,實際上我只需要識別它們,沒有別的。 :) – Maverick

+0

這將無法在應用程序中使用表單身份驗證...(據我所知)User.Identity.Name爲null :(。 – Maverick

+0

只是發現了一些引用,可能對你有用。 msdn.microsoft.com/en-us/library/ms972958.aspx http://www.codeproject.com/Articles/37558/Windows-Authentication-Using-Form-Authentication – eka

相關問題