9

특정 세션 데이터가 존재하는지 확인하는 컨트롤러에 대한 대체 기능이 있습니다. 이 데이터는 저장소가 올바르게 작동하는 데 필요하므로 존재하지 않으면 사용자가 로그 오프해야합니다.컨트롤러에서 리디렉션 초기화가 작동하지 않음

protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
{ 
    base.Initialize(requestContext); 
    if (Session["CompanyID"] != null) 
    { 
     repo.CompanyID = (long)Session["CompanyID"]; 
    } 
    else 
    { 
     RedirectToAction("LogOff", "Account"); 
    } 
} 

내 코드는 다음과 같습니다,하지만 RedirectToAction가 호출되는 경우에도 컨트롤러는 여전히 기본 동작을 열고 사용자가 로그 오프되지 않습니다. 이 문제를 해결하는 방법을 권장 할 수 있습니까?

나는이 세션 데이터를 이런 방식으로 사용하고 있는데, 내가 알 수있는 첫 번째 장소이기 때문에 여기에 나와 있습니다.이 특정 데이터가 있는지 확인할 수 있습니다. 사용자 로그인시 작성됩니다.

이 데이터는 데이터베이스의 사용자의 일부입니다. 맞춤 멤버십 및 역할 공급자를 만들었습니다. 이 데이터를 MembershipUser 유형의 "User"에 추가하여 사용자 username과 같은 생성자에서 액세스 할 수 있습니까?

답변

12

사용자 정의 ActionFilter을 대신 사용해보십시오.

public class HasCompanyIdAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.HttpContext.Session["CompanyID"] == null) 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {action = "LogOff", controller = "Account"})); 
     } 
    } 
} 

는 그 다음 그렇게으로 적용 할 수 있습니다

[HasCompanyId] 
public class MyController : Controller 
{ 
    public ActionResult SomeAction() 
    { 
     return View(); 
    } 
} 

이것은 MyController에가 (또는 서브 클래스의) 처리하는 모든 요청에 ​​대해 속성을 적용합니다.

+0

나는이 원리를 이해하지만 조금 비현실적 인 것처럼 보인다. 나는 공개적인 영역의 어플리케이션이 있기 때문에 그것을 글로벌 필터로 만들지 못한다. 그런 다음 그것을 필요로하는 영역 내부의 모든 액션에 적용해야만 하는가? 초기화 후 다른 컨트롤러의 다른 동작으로 컨트롤러의로드를 끊는 다른 방법이 있습니까? – Zaak

+0

컨트롤러에 속성을 적용 할 수 있으며 해당 컨트롤러 또는 컨트롤러 기본 클래스 내의 모든 작업에 적용되며 모든 파생 클래스 작업에도 작업이 적용됩니다! –

+0

흠,이 방법은 아직 한 번 설정해야한다는 사실을 해결하지 못합니다. 이 방법으로 FilterAttribute를 통해 일을하는 것은 컨트롤러가 인스턴스화 될 때만 액션이 실행될 때마다 설정하는 것 같습니다. – Zaak

2

대신 기본 클래스에서 OnActionExcuting을 재정 의하여 솔루션을 구현하십시오. 그런 다음 액션 필터에서 수행 할 수있는 모든 작업을 수행 할 수 있습니다. 좋아요 :

public void OnActionExecuting(ActionExecutingContext filterContext){ 
    if (filterContext.HttpContext.Session["CompanyID"] != null) 
    repo.CompanyID = (long)filterContext.HttpContext.Session["CompanyID"]; 
    else 
    filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {action = "LogOff", controller = "Account"})); 
} 

간결하게하기 위해 일부 코드가 생략되었습니다.

필자는 두 가지 접근법을 모두 시도했으며 동작 필터를 통해 구현하는 것이 필자가 가지고 있던 의존성 주입 요구 사항 때문에 더 복잡했습니다. 어느쪽으로 든 할 수 있지만 기본 클래스 접근 방식이 조금 더 명확하다고 느꼈습니다. 또한 기본 클래스에 몇 가지 속성을 설정하여 컨트롤러 메서드에서 사용할 수있는 몇 가지 표준 개체를 만들어 DEV에 반복 코드를 저장하는 작업을 추가하려고했습니다. 기본 클래스 방식을 사용하면이 작업을 쉽게 수행 할 수 있습니다.

내가 추가 할 한 가지주의 할 점은 이것이 인증/보안에 대한 좋은 접근 방법이 아니라는 것입니다. 나는이 작업을 실행하기 전에 일부 작업/유효성 검사를 수행하려는 관점에서 이것을보고 있습니다. DRY 원칙을 따르기 위해 컨트롤러 인스턴스에 미리 채워진 일부 데이터를 설정합니다.

는 도움이되기를 바랍니다.

관련 문제