2009-07-19 8 views
0

asp.net global.asax에서 httpcontext.user에서 역할을 할당하는 코드는 어디에 써야합니까?Asp.net Formauthentication에서 "Hhtpcontext.user"역할

내가 사이트에서 읽은 것은 global.asax의 "Application_onPostauthentication"이벤트의 일부가되어야한다는 것입니다.하지만 거기에 쓸 경우 사용자의 각 요청마다 실행됩니다. 나는 이것이 세션에서 하나의 인증을 위해 하나를 가져와야한다고 생각한다.

마이크로 소프트가 코드 작성을 제안하는 이유조차 모르겠습니다. 아무도 내가 사실을 분명히 알 수 없다면?

답변

1

.NET 2.0에서는 설정 역할을 처리하는 the built-in role management feature을 사용할 수 있습니다.

.NET 1.1의 경우 또는 기본 제공 역할 관리를 사용할 수 없거나 사용하지 않으려는 경우 PostAuthenticateRequest 이벤트를 사용하는 것이 좋습니다.

(a) 세션의 수명이 양식 인증 쿠키의 유효 기간과 완전히 독립적이며 (b) 세션이 활성화되지 않았기 때문에 세션은 역할 저장에 사용되지 않습니다.

각 요청마다 역할을 설정해야하지만 이는 문제가되지 않습니다. 데이터베이스 (*)에서 매번 검색 할 필요가 없습니다. 어딘가에 캐시 할 수 있습니다. 세션에서 캐시하는 것은 합리적인 해결책이지만 데이터베이스를 찾지 못하면 데이터베이스에서 다시 읽는 코드를 포함시켜야합니다.

(*) 또는 저장 한 곳 어디에서나 사용할 수 있습니다.

편집

예를 들어, 당신은 같은 것을 할 수있는 세션에서 역할 캐시 : 또는 당신이 ASP.NET 캐시의 역할을 저장하여 세션에 대한 종속성을 피할 수

string[] GetRoles(string userName) 
{ 
    string[] roles = Session["Roles"] as string[]; 
    if (roles == null) 
    { 
     roles = GetRolesFromDatabase(userName); 
     Session["Roles"] = roles; 
    } 
    return roles; 
} 

을 아마도 슬라이딩 만료와 함께. 캐시는 모든 요청간에 공유되므로 캐시 키의 일부로 사용자 이름을 사용해야합니다.

string[] GetRoles(string userName) 
{ 
    string cacheKey = "Roles:" + userName; 

    string[] roles = Cache[cacheKey] as string[]; 
    if (roles == null) 
    { 
     roles = GetRolesFromDatabase(userName); 
     Cache.Insert(cacheKey, roles, ...); 
    } 
    return roles; 
} 
+0

멋진 솔루션을 제공해 주셔서 감사합니다. 귀하의 회신 즉 마지막 단락. "세션에서 역할을 잡는 것이 합리적인 해결책입니다" 예제 링크가 있으면 이해할 수 있도록하십시오. –

+0

@HemantKothiyal : 지옥, 왜이 대답을지지하지 않고 받아들이지 않았습니까? 매우 유용하며 Joe는 귀하의 의견을 듣고 추가 정보를 제공하기까지했습니다. 나는 왜 당신이 그의 노력에 감사하지 않는지 이해하지 못합니다. – Slauma