2011-03-04 7 views
3

Request, Response 속성을 System.Web.Mvc.Controller 클래스로 사용하여 HTTP 요청 및 응답에서 쿠키를 설정하고 읽으 려합니다. 그 이유는 요청에서 읽어 들이고 일부 도우미 클래스에서 데이터를 채우는 유틸리티 클래스를 작성할 필요가 없기 때문입니다. 모든 사용자 정의 기본 컨트롤러 (모든 컨트롤러가 파생 된)에서 이러한 코드를 모두 푸시 할 수 있습니다. ASP.NET MVC에서 Controller.Request를 채우는 방법

그래서 난에 다음과 같은 코드를 가지고 내`BaseController '

if (Request != null) 
{ 
    HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
    if (authCookie != null) 
    { 
     HttpContext.User = new GenericPrincipal(new GenericIdentity(authCookie.Value), null); 
     Thread.CurrentPrincipal = HttpContext.User; 
    } 
} 

하지만 Request는 항상 null입니다. 어떻게 채워 집니까?

답변

4

이 코드가 기본 컨트롤러의 생성자에 있으면 정상입니다. Initialize 방법으로 입력해야합니다. 또한 당신이하는 일은 컨트롤러에서해서는 안됩니다. 코드를 보면 HttpContext.User 속성을 채우는 것처럼 보입니다. 사용자 정의 권한 부여 작업 필터에서이 작업을 수행해야합니다.

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) 
    { 
     var result = base.AuthorizeCore(httpContext); 
     if (result) 
     { 
      var authCookie = httpContext.Request.Cookies[FormsAuthentication.FormsCookieName]; 
      if (authCookie != null) 
      { 
       httpContext.User = new GenericPrincipal(new GenericIdentity(authCookie.Value), null); 
       Thread.CurrentPrincipal = httpContext.User; 
      } 
     } 
     return result; 
    } 
} 

다음이 속성을 사용하여 기본 컨트롤러 장식 : 예를 들어

이 속성은 사용자가 필요

[MyAuthorize] 
public abstract class BaseController: Controller 
{} 

공지 것을는 해당 작업에 대한 액세스 권한을 부여하기 위해 인증을 받아야합니다 따라서 인증을 필요로하는 컨트롤러/동작에서만 사용하십시오.

+0

저는 실제로'Initiaze' 메소드에 제 코드를 넣었습니다. 나는 또한 MyAuthorizeAttribute를 가진다. 내 문제는 조롱하는 것입니다. 만약 내가 당신의 접근 방식으로 가면'HttpContextBase'를 조롱하고 의존성으로 주입해야합니다 (Moq와 StructureMap을 사용하고 있습니다). 나는 그것이 특히 어려운 것을 안다. 'Controller.HttpContext' 또는'Controller.Request'를 사용하면 컨트롤러에서이 속성들을 쉽게 조롱 할 수 있습니다. – Suhas

+0

@ Suhas,'HttpContextBase'는'AuthorizeCore' 메소드의 인자로 전달됩니다. 단위 테스트에서해야 할 일은 그것을 조롱하고 통과시키는 것입니다. –

관련 문제