2011-09-26 68 views
2

我使用簡單的.NET身份驗證用戶登錄到達網絡:Membership.GetUser()。UserName; (.NET 4,MVC 3)

if (Membership.ValidateUser(user, passwd)) 

工作正常。熱議的是高跟鞋,我試圖獲取用戶名:

Membership.GetUser().UserName 

有時這會返回一個無效的對象。有時不。 我似乎無法檢測到哪個模式。

例如,用戶使用「root」/「密碼」在系統中以有效角色登錄。 ValidateUser()調用成功,但是Membership.GetUser()。UserName返回無效的對象。 2秒鐘後,再次做同樣的事情,並驗證和GetUser()成功。

什麼想法?


..編輯1 .. 以下是我使用的用戶名:

Roles.GetRolesForUser(Membership.GetUser().UserName); 

,當我在System.Environment.UserName互換,角色列表回來空。

如果我保持原樣,並且使用'true'作爲我的第二個參數來設置auth cookie,它可以正常工作。

FormsAuthentication.SetAuthCookie(user, true); 

如果我使用HttpContext.Current.User.Identity.Name,角色列表是精細設置爲true或false的AUTH的cookie。

現在,我理解有關性能的問題。這對我很重要。但我也需要確保應用程序的功能正確。

+0

「無效對象」是什麼意思?空值? –

+0

如果您只是想獲取用戶名,您可能需要考慮抓取System.Environment.UserName。我不是100%肯定的,但我認爲這個屬性並不需要去Getuser()所在的數據庫。如果我是正確的,這將意味着更好的性能和更少的開銷。 – David

+0

哦。好吧,會發生什麼是GetUser()返回的不是一個真實的對象,然後.GetName從該對象拋出'NullReferenceException'異常。我也會看看System.Environment.UserName。 – horace

回答

6

爲什麼你不能使用

HttpContext.Current.User.Identity.Name 

+0

dunno。從來沒有編程的asp.net c#之前.. ;-) ...會給它一個鏡頭。 – horace

+0

感謝andyc - 你知道這是否是一次回到db的旅程嗎?似乎不是因爲'Name'看起來像一個屬性(呃,它不應該*去db,但是你永遠不會知道程序員心中潛藏着什麼邪惡的東西......-) – horace

+0

不,它沒有旅行回到數據庫。 HttpContext.Current實際上是當前Http上下文的包裝。 – AndrewC

2

Membership.ValidateUser()回報truefalse用戶是否是有效還是無效,但它並沒有在他們簽名。

Membership.ValidateUser Method

驗證提供的用戶名和密碼是否有效。

試試這個:

bool createPersistentCookie = true; // remember me? 

if (Membership.ValidateUser(user, passwd)) { 
    FormsAuthentication.SetAuthCookie(user, createPersistentCookie); 
    if (FormsAuthentication.GetAuthCookie(user, createPersistentCookie) == null) 
     throw new SecurityException("Authentication persistence failed"); 

    Membership.GetUser().UserName; // should have a value now 
} 
else 
{ 
    // invalid login 
} 
+0

截至目前,我打電話FormsAuthentication.SetAUthCookie(用戶,*虛假*)..是'假'絆倒了我?我只是將錯誤改變爲真,並且似乎每次都有效。我會查找dox來查看這個真正意義。 – horace

0

您是否使用Cookie來保持用戶憑據?如果是這樣的..我認爲應該採取以下認證步驟:

  1. 呼叫的ValidateUser檢查正確的憑據..因爲你已經做
  2. 呼叫FormsAuthentication。SetAuthCookie來設置身份驗證Cookie
  3. 的Response.Redirect( 「有些主頁或其他」);將刷新憑證餅乾,讓你有效的用戶對象

希望它可以幫助

+0

方法if(validate user){FormsAuthentication.SetAuthCookie(user,false); } ... 你是這個意思嗎?在所有這些發生之後,GetUser()被稱爲*。 – horace

+0

看到我..編輯1 ..上面 – horace

1

我使用system.web.security方法來驗證用戶使用Web服務方法。 我根本不使用FormsAuthentication中的cookie身份驗證。

我必須建立在web.config文件

<add name="rule1" url="~/WebService.svc/rest/help" method="*" role="?"/>  
    <add name="rule1" url="~/WebService.svc/rest/Method1" method="*" role="service"/> 
    <add name="rule1" url="~/WebService.svc/rest/Method2" method="*" role="service"/>... 

Web服務方法然後將以下代碼相關的角色被稱爲每一個請求進入驗證認證時間:

Membership.ValidateUser(username, password); //Validates user credential 
Roles.IsUserInRole(username, "/WebService.svc/rest/Method2"); //Verifies User is authorised for method in question