2009-10-12 3 views
10

ASP.NET MVC 1.0을 사용하는 응용 프로그램에서 작업 중이며 사용자 지정 IPrincipal 개체를 HttpContext.Current.User 개체에 삽입하려고합니다.ASP.NET MVC 사용자 지정 IPrincipal 삽입

기존 WebForms 응용 프로그램에서는 다음과 같이 Application_AuthenticateRequest 이벤트를 사용했습니다.

protected void Application_AuthenticateRequest(object sender, EventArgs e) 
    { 
     if (HttpContext.Current.User != null) 
     { 
      if (HttpContext.Current.User.Identity.IsAuthenticated) 
      { 
       if (HttpContext.Current.User.Identity is FormsIdentity) 
       { 
        // Get Forms Identity From Current User 
        FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity; 
        // Get Forms Ticket From Identity object 
        FormsAuthenticationTicket ticket = id.Ticket; 
        // Create a new Generic Principal Instance and assign to Current User 
        SiteUser siteUser = new SiteUser(Convert.ToInt32(id.Name)); 

        HttpContext.Current.User = siteUser; 
       } 
      } 
     } 

    } 

이렇게 사용하여 사용자 개체를 명시 적으로 캐스팅하여 SiteUser를 입력하여 사용자 지정 IPrincipal에 액세스 할 수있었습니다. 나는 실제로 모든 페이지가 상속받은 커스텀 클래스를 가짐으로써 이것을 수행했다.

아무리해도 내 문제는 ASP.NET MVC에서 응용 프로그램을 죽게하는 요청 (JS 파일, 이미지 등)이 발생할 때마다 Application_AuthenticateRequest가 실행되는 것 같습니다.

ASP.NET MVC 1.0 내에서 HttpContext.Current.User 객체에 사용자 지정 IPrincipal을 주입하는 방법에 대한 도움이나 제안 사항은 크게 감사하겠습니다. 나는 다음과 같은 소식을 보았지만, 달성하고자하는 것을 만족시키지 못했습니다. ASP.NET MVC - Set custom IIdentity or IPrincipal

TIA.

+0

파일 유형에 관계없이 죽지 않아야합니다. 어떤 오류가 표시됩니까? – blowdart

+0

요청 된 모든 리소스에 대해 Application_AuthenticateRequest 메서드에서 "히트"를 얻습니다. Application_AuthenticateRequest 메서드를 사용하지 않고 실행하는 것에 비해 페이지가 고통스럽게 느리게 렌더링됩니다. SiteUser 객체의 생성자는 특히 탁월한 작업을 수행하지 않고 DB에서 사용자 세부 정보 및 역할 목록을 가져옵니다. –

+0

물론 IIS7이 작동하는 방식입니다. 나는 당신이 에러로 죽어가는 것을 의미한다고 생각했습니다. – blowdart

답변

8

내 문제는 ASP.NET MVC 으로하여 Application_AuthenticateRequest 어떤 요청이 죽을 수있는 응용 프로그램을 일으키는 (그래서 JS 파일, 이미지 등) 제작 때마다 불 것으로 보인다는 것이다.

이것은 고유 한 MVC 문제가 아닙니다. IIS7에서 통합 파이프 라인을 사용하여 응용 프로그램을 실행 한 경우 똑같은 것을 볼 수 있습니다.

조회에 문제가 확장 성 경우

은 내가 당신의 SiteUser 클래스는 데이터베이스 조회의 일종을한다는 것을 추측에는 요
FormsAuthenticationTicket ticket = id.Ticket; 
SiteUser siteUser = new SiteUser(Convert.ToInt32(id.Name)); 

내에서 실제 문제가 가정합니다. 양식 auth가 작동하는 방식을 검토하면 FormsIdentity를 생성하는 데 필요한 모든 정보가 티켓에 포함됩니다 (쿠키에 역할 캐싱을 구체적으로 설정하지 않은 경우 역할에는 해당되지 않습니다). 그래서 당신은 똑같은 접근 방식을 찾아야 만합니다. 처음으로 siteUser 객체를 생성하면 서명 된 쿠키 내에 캐시됩니다. 그런 다음 쿠키를 사용하여 후속 요청에서 SiteUser 속성을 다시 확보 할 수 있습니다.

이 경우에는 Thread 원칙을 SiteUser로 바꾸거나 SiteUser 클래스와 동일한 정보를 가진 사용자 지정 IPrincipal/IUser 조합을 적어도 하나 더 추가 할 수 있습니다. 당신이 있는지 확인하는 것이 좋습니다

HttpContext.Current.User = sessionSecurityToken.ClaimsPrincipal; 
Thread.CurrentPrincipal = sessionSecurityToken.ClaimsPrincipal; 
this.ContextSessionSecurityToken = sessionSecurityToken; 

같은 것을 포함 할 주체를 첨부 할

SiteUserSecurityToken sessionToken = null; 
if (TryReadSiteUserSecurityToken(ref sessionToken) && sessionToken != null) 
{ 
    // Call functions to attach my principal. 
} 
else 
{ 
    if (HttpContext.Current.User != null && 
     HttpContext.Current.User.Identity.IsAuthenticated && 
     HttpContext.Current.User.Identity is FormsIdentity) 
    { 
     // Get my SiteUser object 

     // Create SiteUserSecurityToken 

     // Call functions to attach my principal. 
    } 
} 

같은 몇 가지 흐름과 기능이있을 것이다 대해 AuthenticateRequest 내부 그래서

기능 것을 보안 토큰을 쿠키 추가 (최소한 체크섬/MAC 값)에 기록하고 원하는 경우 컴퓨터 키를 사용하여 암호화를 지원하도록 구성되어 있으면이를 지원합니다.읽기 함수는 이러한 값의 유효성을 검사해야합니다.

+0

정말 훌륭합니다. 고마워요. 내 편에서의 모범적 인 오류! 많은 감사합니다. –

1

이것은 custom Authorization Filter의 직업과 비슷합니다.

+0

나는 이것을 고려해 보았습니다. 그러나 강하게 타입이 지정된 사용자 객체를 다른 방법으로 사용할 수 있기를 바랍니다. 사용자 정의 권한 필터를 생성하고 사용자 기본 컨트롤러 클래스에서 내 User 객체를 연결하기 시작할 필요가 없기를 기대했지만 그렇게 될 수도 있습니다. 나는 커스텀 멤버쉽 제공자를 구현하기를 정말로 원하지 않는다. 어쨌든 제안 해 주셔서 감사합니다 :) 그것은 내가 취해야 할 접근 방식 인 것처럼 빠르게 보입니다. –

+0

* 왜 * 사용자 정의 교장을 주입하고 있는지 설명하면, 아마도 더 많은 ASP.NET MVC가 문제를 해결할 방법이있을 것입니다. – bzlm

관련 문제