2012-11-30 23 views
6

我在我的.NET MVC4項目中使用SimpleMembership。在開發過程中,在手動操作/重建數據庫的同時,我遇到了一個在生產中不太可能出現的錯誤,但是我想解決這個問題,而且我找不到一個優雅的方式來處理它。.NET MVC4 SimpleMembership錯誤 - 「沒有找到用戶發現的名稱爲XXX」

如果登錄到應用程序後,您的用戶名被在數據庫中更改,或者您的用戶記錄完全刪除,用戶將不再能夠訪問應用程序的任何網頁...包括公共頁面,允許匿名視圖和登錄屏幕。相反,會拋出異常 - 「找不到找到名爲'username'的用戶」。

在我的申請的所有網頁顯示這使得一個登錄/註銷控制的局部視圖。無論數據庫中有什麼,Request.IsAuthenticated都會返回true。看起來應用程序認爲用戶仍然基於cookie中的信息登錄,但在數據庫中找不到相應的記錄。清除身份驗證cookie解決了這個問題,但這不是我想要提供給可能遇到此問題的用戶的指示。

我目前的解決辦法是捕捉在Global.asax,清除Cookies是例外,並重定向到登錄頁面。這對我來說似乎完全不好。

有沒有人有一個更好的解決方案,此方案?我從來沒有遇到類似這樣的使用舊.NET成員提供者的問題......我的期望是,這種情況應該立即被覆蓋,我不應該考慮它......如果記錄被改變/在數據庫中刪除,用戶應該只是失敗授權,並被自動重定向到登錄頁面。

回答

1

您可以檢查數據庫緩存或頁面的某處,登錄後,依賴於用戶記錄,它依賴於,鏈刪除或由於依賴注入可能發生。

請檢查,或請分享代碼..

-1

這似乎切換時,從你的開發環境到另一個主機造成的。 本地主機正在記住登錄cookie並嘗試將其用於新的簡單成員資格數據庫。

正如你所說的它不生產發生。對不起,我不知道在本地和生產數據庫上使用相同登錄名的更好方法。

+0

嗯,我想它還是會在生產中發生,我的意思是它可能不會發生,因爲在生產環境中我不會手動刪除數據庫中的記錄。這不是切換主機的問題。我沒有花更多的時間來弄清楚如何克服這個問題,但它基本上與我的瀏覽器中的一個身份驗證cookie有關,該身份驗證cookie引用了數據庫中不再存在的用戶......我只希望這個被處理更加優雅的開箱。 – Gadget27

1

不知道你有你的身份驗證邏輯第一,但這裏是我做的:

在Global.asax.cs中:

protected void Application_Error(object sender, EventArgs e) 
    { 
     Exception ex = Server.GetLastError(); 

     if (ex.Message.Contains("No user found was found that has the name")) 
     { 
      FormsAuthentication.SignOut(); 
      Response.Redirect(Request.RawUrl); 
     } 
    } 

由於拋出的異常僅僅是一個System.InvalidOperationException,有你可以用它做很多事情。不是很聰明,但是需要做什麼。此外,確保在頁面上你重定向到沒有像IsUserInRole(...)沒有驗證邏輯,如果是的話,那麼你可能想將它包裝在try{} catch(){}

1

我是有這個同樣的問題,IsAuthenticated返回true,而我是未登錄到MVC 4站點,導致相同的錯誤消息。 在我們的解決方案中,我有兩個使用SimpleMembership的MVC 4站點,事實證明我在調試第二個站點時已登錄到第一個站點。 我認爲這將與設置爲在兩個站點在localhost en下的不同端口下運行的cookie有關,因此兩者都將設置相同的身份驗證Cookie。我可能需要更改認證cookie的設置方式。

我認爲你可能有不同的問題,但也許我的「解決方案」可以幫助有人遇到這個問題。

+1

這個解決方案爲我工作,我從另一個網站登錄,當我切換網站時,它給了我這個錯誤。只要清除緩存/ cookies,它就可以正常工作。 –

0

覆蓋AuthorizeAttribute:

public sealed class AuthorizeAttribute : System.Web.Http.AuthorizeAttribute 
{ 
    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
    try 
    { 
     return base.IsAuthorized(actionContext); 
    } 
    catch 
    { 
     return false; // user name from cookie is no longer in db 
    } 
    } 

    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 
    { 
    // handle this exception by global exception filter for redirection to login 
    throw new CustomAuthException(); 
    } 
} 
0

我已經加入到阿爾曼Bimatov響應,以便它記錄您重定向到當前頁面之前是你的。通過將您重定向到當前頁面,然後returnURL將正確放入查詢字符串中。

在Global.asax.cs中:

 
protected void Application_Error(object sender, EventArgs e) 
    { 
     Exception ex = Server.GetLastError(); 

     if (ex.Message.Contains("No user found was found that has the name")) 
     { 
     FormsAuthentication.SignOut(); 
     Response.Redirect(Request.RawUrl); 
     } 
    } 

但是,這是行不通的,除非你有你的web.config一個CustomerErrors部分按照這樣的問題: global.asax Application_Error not firing

+0

http://stackoverflow.com/questions/3713939/global-asax-application-error-not-firing –

相關問題