2012-12-06 2 views
2

SimpleMembership이 UserId를 어딘가에 보관하는지 궁금하다.UserIdentity에 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) 

그래서, 중복 한 쿼리를 - 첫 번째, 두 번째 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 

을 당신은 내가 객체로 userProfile 테이블이

UserInfo.userId 

를 수행하여 언제든지 액세스 할 수 있습니다 내 응용 프로그램의 클래스

편집

나는 EF5을 사용하고

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); 
    } 

사용자 로그인 후에 실행됩니다이 코드가 있고이 부분의 경우를 적용해야합니다, 그래서 나는 나의 모델의 userProfile 테이블이 당신은 EF를 사용하지 않습니다.

내가 userId을 필요로 할 때 나는 단지 SessionHelpers.UserInfo.userId을 할뿐입니다. 이렇게하면 데이터베이스를 다시 쿼리하지 않고도 필요할 때마다 모든 사용자 프로필 정보를 얻을 수 있습니다.

물론 사용자 프로필에서 변경하는 경우 세션 변수도 업데이트해야합니다.

고급 논리가 있어야하고 세션이 null이 아닌지 확인해야 할 수도 있습니다 (다른 곳에서하고있는 작업).

+0

올바르게 이해하면 앱에 중복 된 검색어가 있지만 로그인 액션 직후입니다. WebSecurity.Login()을 사용하여 로그인하고 있습니까? – user1838937

+0

내 편집을 확인하고 도움이되는지 확인하십시오. 나는 당신의 코멘트에 대한 편집을 보지 못했습니다. 예, 저는 WebSecurity.Login()을 사용하고 있습니다. 그 의미에서 나는 이중 쿼리를하고 있다고 가정합니다. – Eonasdan

+0

저는이 솔루션을 좋아합니다. 투표를 할 수는 있지만 명성이 너무 낮습니다.) 승인 필터에서 파생 된 데이터를 사용할 방법이 없다면 실망 할 것입니다. – user1838937