2012-12-06 60 views
2

我不知道是否SimpleMembership保持UserId某處,或者如果不,如何強制它保留,一旦派生數據。我可以在User.Identity中保留UserId嗎? MVC4 SimpleMembership

我有簡單的動作:

[Authorize(Roles="User")] 
    public ActionResult Create() 
    { 
     var ownerId = WebSecurity.GetUserId(User.Identity.Name); 
     return View() 
    } 

而且我MiniProfiler說:

DECLARE @0 nvarchar(4) = N'NICK' 
SELECT [UserId] FROM [UserProfile] WHERE (UPPER([UserName]) = @0) 

DECLARE @0 int = 2 
SELECT r.RoleName FROM webpages_UsersInRoles u, webpages_Roles r Where 
(u.UserId = @0 and u.RoleId = r.RoleId) GROUP BY RoleName 

DECLARE @0 nvarchar(4) = N'NICK' 
SELECT [UserId] FROM [UserProfile] WHERE (UPPER([UserName]) = @0) 

的用戶ID所以,我重複查詢 - 率先拿到角色,第二致電WebSecurity.GetUserId(User.Identity.Name);。調用[Authorize]之後,有沒有一種聰明的方法可以將UserId保存在某個地方?

回答

4

我通常將我的用戶配置文件包裝在會話變量中。

public static userProfile UserInfo 
{ 
    get { return HttpContext.Current.Session["UserInfo"] as userProfile; } 
    set { HttpContext.Current.Session["UserInfo"] = value; } 
} 

在查詢的用戶登錄後UserProfile表,並做

UserInfo = QueryAsClass; //you need to map your sql to an object 

一旦那裏,你可以通過做

UserInfo.userId 

訪問它任何時候我有userProfile表作爲對象在我的應用程序類

編輯

我有這樣的代碼,被

using (var db = new DBEntities()) 
    { 
     var userId = WebSecurity.GetUserId(HttpContext.Current.User.Identity.Name); 
     if (userId == -1) return; 
     SessionHelpers.UserInfo = db.userProfiles.Single(x => x.userId == userId); 
    } 

我使用EF5用戶登錄後執行,我有userProfile表在我的模型,所以你需要適應這部分如果你沒有使用EF。

當我需要userId我只是SessionHelpers.UserInfo.userId。這讓我可以在不需要重新查詢數據庫的情況下獲取所有用戶的配置文件信息。

當然,如果你更改在用戶的配置文件中的東西,你也需要更新你的會話變量。

您可能需要更高級的邏輯,並檢查會話是否爲空(我在其他地方正在做)。

+0

因此,如果我理解正確,在您的應用中仍有重複的查詢,但僅在登錄操作之後。您是否使用WebSecurity.Login()登錄? – user1838937

+0

檢查我的編輯,看看是否有幫助。我沒有看到您的評論的編輯。是的,我正在使用'WebSecurity.Login()'。從這個意義上說,我想我正在做一個雙重查詢 – Eonasdan

+0

我喜歡這個解決方案。我會投票,但是我的名聲太低;)如果沒有辦法使用由Authorize過濾器派生的數據,我會感到失望。 – user1838937

相關問題