2011-04-30 3 views
0

에 기반한 멤버십 테이블에서 값을 반환합니다. asipnet_users 테이블의 UserId, BusinessId 및 BusinessName 필드를 포함하는 Business라는 테이블을 만들었습니다. 내가 Context.CurrentUser를 사용하여 알고asp.net 멤버십 데이터베이스를 사용하는 mvc3을 사용하여 현재 사용자 ID

..... 나는 이름 등 내 컨트롤러 중 하나가 액세스 할 수있는 어딘가에 BusinessId를 저장할 수 있어야합니다

를 얻을 수는 가장 좋은 방법은 무엇인가 이 작업을 수행? 현재 사용자를 기반으로 BusinessId를 얻기 위해 매번 데이터베이스로 다시 전화하고 싶지 않습니다.

어딘가에 context.session을 만드나요?

모든 포인터가 정말 도움이 될 것입니다!

답변

0

하나의 가능성은 세션 변수를 사용하는 것입니다. 또 다른 하나는 쿠키에 저장된 인증 티켓의 userData 부분에이 정보를 유지하는 것입니다. 그런 다음 사용자 정의 principal을 작성하고 인증 쿠키를 읽고, 티켓을 해독하고 정보를 검색 할 권한을 부여 할 수 있습니다.


UPDATE : 코멘트 섹션에서 요청으로

여기에 두 번째 방법이 구현 될 수있는 방법의 예입니다.

우리는 사용자 정의 주체를 정의로 시작 :

public class CustomPrincipal : GenericPrincipal 
{ 
    public CustomPrincipal(IIdentity identity, string[] roles, string businessId) 
     : base(identity, roles) 
    { 
     BusinessId = businessId; 
    } 
    public string BusinessId { get; private set; } 
} 

다음 사용자는 속성 권한을 부여 : 비즈니스 ID가 userData에 포함되도록

public class CustomAuthorize : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var isAuthorized = base.AuthorizeCore(httpContext); 
     if (isAuthorized) 
     { 
      var cookie = httpContext.Request.Cookies[FormsAuthentication.FormsCookieName]; 
      var ticket = FormsAuthentication.Decrypt(cookie.Value); 
      var identity = new GenericIdentity(ticket.Name); 
      var principal = new CustomPrincipal(identity, null, ticket.UserData); 
      httpContext.User = principal; 
     } 

     return isAuthorized; 
    } 
} 

다음에 우리가 login 액션을 수정해야 인증 쿠키의 일부 :

[HttpPost] 
public ActionResult LogOn(string username, string password) 
{ 
    SomeUserModel user = FetchUserFromSomewhere(username, password); 
    if (user == null) 
    { 
     // wrong username/password => redisplay login form 
     return View(); 
    } 

    var ticket = new FormsAuthenticationTicket(
     1, 
     username, 
     DateTime.Now, 
     DateTime.Now.AddMinutes(FormsAuthentication.Timeout.TotalMinutes), 
     false, 
     user.BusinessId // that's where we store the business id 
    ); 
    var encryptedTicket = FormsAuthentication.Encrypt(ticket); 
    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) 
    { 
     HttpOnly = true, 
     Secure = FormsAuthentication.RequireSSL 
    }; 
    Response.AppendCookie(cookie); 
    return RedirectToAction("Index", "SomeController"); 
} 
} 

마지막 부분 어떤 행동에 사용자 지정 권한 부여 속성을 사용하는 것입니다

[CustomAuthorize] 
public ActionResult Foo() 
{ 
    var businessId = ((CustomPrincipal)User).BusinessId; 
    ... 
} 

당신은 기본 컨트롤러를 작성하고 당신이 비즈니스 ID에 액세스해야 할 때마다 캐스팅 피하기 위해 속성으로이 사용자 정의 주요 노출 될 수 있습니다.

+0

대린 감사, 모범 사례로 간주되는 것은 무엇입니까? –

+0

@Diver Dan, 개인적으로 가능한 한 세션을 피하려고 노력하면서 두 번째로 갈 것입니다. –

+0

감사합니다. 사용자 지정 기본 특성을 만드는 방법에 대한 연구를 수행 할 것입니다. –

관련 문제