2009-07-03 6 views
2

우리는 asp.net mvc를 사용하여 사이트를 구축하고 있습니다. 사용자가 쉽게 계정을 등록하고 만들 수 있도록하고 싶습니다. 그의 프로필에 등록 될 매우 특별한 정보가 있지만, 등록이 끝나고 처음 로그인하는 사람에게 보여주고 싶습니다.asp.net MVC, 페이지가없는 프로필이 등록 된 사용자를 리디렉션하는 방법?

논리는 사용자가 인증되고 유효한 프로필이없는 경우 "프로필 만들기"페이지로 리디렉션되는 URL입니다.

전체 UI는 해당 프로필 선택 사항에 따라 달라집니다. 이 워크 플로를 방문자에게 강제로 적용하기 위해 MVC 프레임 워크 내에서 어떤 접근 방식을 사용해야합니까? 내가 생각해 낼 수있는 아이디어는 콘트롤러 등에서 많은 코드 중복을 필요로하기 때문에 분명히 나쁜 생각이다.

우리는 사용자를 위해 회원 자격을 사용하고 있지만 프로필은 프로필 데이터를 사용자 ID에 연결하는 자체 구현 (프로필 공급자 없음)입니다.

답변

3

나는 이것을하는 가장 쉬운 방법 중 하나는 사용자 정의 AuthorizeAttribute를 만들거나 기존 필터를 확장하거나 별도의 FilterAttribute를 만드는 것이라고 생각합니다. 이 중 하나가 모든 컨트롤러에 적용되고 인증 된 사용자에게 프로필이 있는지 확인하십시오. 프로필이없는 경우 필터는 사용자가 프로필이 만들어진 페이지로 리디렉션됩니다. 이 작업은 컨텍스트의 result 속성을 RedirectResult로 설정하여 프로파일 만들기 작업을 수행함으로써 수행됩니다. 프로파일이 존재하고 완료되면 필터를 통해 사용자는 원하는 작업을 진행할 수 있습니다.

또는 OnActionExecuting을 무시하고 동일한 작업을 수행하는 기본 컨트롤러를 만들 수 있습니다. 프로필 메커니즘 (프로필 설정 작업 포함)없이 사용할 수있는 공개 작업이있을 수 있으므로 속성 메커니즘을 더 선호합니다.

+0

나는 당신이 항상 이것을 원한다는 것을 알고있을 때 반복적으로 같은 액션 필터를 적용해야한다는 큰 부담이 있다고 생각합니다. 기본 컨트롤러로이 작업을 수행 할 것입니다 (모든 컨트롤러가 대신 해당 컨트롤러로부터 상속 받도록해야합니까?) 또는 global.asax의 시작 요청으로 이동하십시오. –

+0

컨트롤러 또는 동작 수준에서 필터를 적용 할 수 있습니다. 컨트롤러 레벨에 적용하면 기본적으로 기본 컨트롤러에서 수행하는 것과 같습니다. 일단 당신이 항상 적용하지 않는 몇 가지 다른 필터를 가지고 있다면, 당신은 필터 메커니즘의 유연성을 이해하기 시작할 것입니다.정말 글로벌 작업 일 때만 기본 컨트롤러 메커니즘을 권하고 싶습니다. 귀하의 경우에 적용될 수 있습니다. – tvanfosson

+0

답장을 보내 주셔서 감사합니다. 실제로 등록 된 사용자가 어디에서든지 적용해야하는 매우 특별한 것처럼 보입니다. 나는 사용자 등록에 너무 많은 부담을주지 않는 추가 사용성에 대해 지불 할 가격이라고 생각합니다. 사용자 지정 기본 컨트롤러를 사용하려면이 검사를 시행해야하는 모든 컨트롤러가 사용자 지정 ctrler를 확장해야합니다. 012andy가 제안한 것처럼 Global.asas에 로직을 넣는 것이 더 쉬울까요? –

2

내 자신의 질문에 대답 (그 요청하거나 유사한 이벤트를 시작하기에) 당신이 실제로 Global.asax에이 리디렉션 로직을 넣어 수없는 대부분의 페이지가 너무, 또는 다른해야 할 경우 ActionFilter 및 FilterAttribute을 고려하십시오 : 결국 사용자 정의 actionFilter를 만들었습니다. 처음에는 [authorize]를 [AuthorizeCheckProfile]로 서브 클래 싱하는 과정을 밟았습니다. 그러나 유스 케이스가 잘못되었다는 것을 깨달았습니다. 사용자 프로필이없는 경우 사이트의 로그인 부분 만 프로필 작성 페이지로 리디렉션하는 것을 원하지 않았습니다. 내 사이트의 어떤 페이지도 프로필이없는 로그인 사용자 인 경우 해당 페이지로 리디렉션하고 싶습니다. 내가 확인하고 싶지 않은 유일한 장소는 실제 프로필에 있습니다. 코드는 다음과 같습니다.

public class AssertProfileAttribute : ActionFilterAttribute { 
    public AssertProfileAttribute() { 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) { 
     if (filterContext.HttpContext.Request.IsAuthenticated == false) 
      return; 
     //we have a user, but does he have a profile? 
     if (filterContext.HttpContext.Session["UserProfile"] == null) { //not in the session 
      IUnityContainer container = filterContext.HttpContext.Application["container"] as IUnityContainer; 
      Profile hasProfile = container.Resolve<IProfileRepository>().GetUserProfile(Membership.GetUser()); 
      if (hasProfile == null) { 
       //we have to redirect to the create profile 
       string returnURL = filterContext.HttpContext.Request.AppRelativeCurrentExecutionFilePath; 
       filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Profile", action = "Create", returnTo = returnURL })); 
      } else { 
       //he has a profile but we haven't put it in session yet 
       filterContext.HttpContext.Session["UserProfile"] = hasProfile; 
      } 
     } 
    } 
} 

세션 키에 프로필을 저장한다는 부작용이 있습니다. 이렇게하면 쉽게 가져올 수 있으므로 다른 사용자 지정 필터를 사용하여 모든 요청에서 추가 역할 확인이 수행 될 수 있습니다. 이 구현은 db 액세스를 위해 Unity 및 저장소를 사용합니다.

커뮤니티에 큰 감사를드립니다.

관련 문제