하나의 가능성은 세션 변수를 사용하는 것입니다. 또 다른 하나는 쿠키에 저장된 인증 티켓의 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에 액세스해야 할 때마다 캐스팅 피하기 위해 속성으로이 사용자 정의 주요 노출 될 수 있습니다.
대린 감사, 모범 사례로 간주되는 것은 무엇입니까? –
@Diver Dan, 개인적으로 가능한 한 세션을 피하려고 노력하면서 두 번째로 갈 것입니다. –
감사합니다. 사용자 지정 기본 특성을 만드는 방법에 대한 연구를 수행 할 것입니다. –