ASP.NET MVC, 페이지에 프로필이없는 등록 된 사용자를 리디렉션하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1079703

  •  21-08-2019
  •  | 
  •  

문제

ASP.NET MVC를 사용하여 사이트를 구축하고 있습니다. 사용자가 쉽게 등록하고 계정을 만들 수 있도록합니다. 매우 특별한 정보가 있지만, 그의 프로필에 등록 될 것이며, 등록이 완료된 후에 그에게 보여주고 싶습니다. 그리고 그는 처음으로 로그인하고 있습니다.

논리는 사용자가 인증하고 유효한 프로필이없는 경우 "프로필 작성"페이지로 리디렉션하는 경우에 맞은 URL입니다.

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

당사는 사용자에게 멤버십을 사용하고 있지만 프로필은 프로필 데이터를 userID에 연결하는 자체 구현 (프로필 제공 업체 없음)입니다.

도움이 되었습니까?

해결책

이 작업을 수행하는 가장 쉬운 방법은 사용자 정의 승인을 작성하거나 기존의 권한을 확장하거나 별도의 Filterattribute를 만드는 것입니다. 이 중 하나는 모든 컨트롤러에 적용되어 인증 된 사용자가 프로필을 가지고 있는지 확인합니다. 프로파일이없는 경우 필터는 사용자를 프로필이 생성 된 페이지로 리디렉션합니다. 이것은 컨텍스트의 결과 속성을 프로파일 생성 동작에 대한 리디렉션으로 설정하여 수행됩니다. 프로파일이 존재하고 완료된 경우에만 필터를 사용하면 사용자가 원하는 동작으로 진행할 수 있습니다.

또는 onactionExecuting을 무시하고 동일한 작업을 수행하는 기본 컨트롤러를 만들 수 있습니다. 나는 속성 메커니즘이 더 유연하기 때문에 선호합니다. 즉, 프로필없이 사용할 수있는 공개 조치 (프로필 설정 조치 포함)를 가질 수 있습니다.

다른 팁

내 자신의 질문에 대답 : 결국 나는 Custom ActionFilter를 만들었습니다. 처음에, 나는 서브 클래스를 [Authorize] [AwerizeCheckProfile]로 가져 갔다. 그러나 사용 사례가 잘못되었다는 것을 깨달았습니다. 사용자 프로파일이없는 경우 사이트의 로그인 한 부분 만 제작 프로파일 페이지로 리디렉션하는 것을 원하지 않았습니다. 나는 원했다 모든 페이지 프로필이없는 로그인 한 사용자 인 경우 해당 페이지로 리디렉션 할 내 사이트의. 내가 확인하고 싶지 않은 유일한 곳은 실제 프로필 창작물에 있습니다. 코드는 다음과 같습니다.

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 및 Repositories를 사용합니다.

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

대부분의 페이지가 필요하지 않은 경우 ActionFilter 및 FilterAttribute를 고려해보십시오. 그렇지 않으면 실제로이 리디렉션 로직을 Global.asax (시작 요청 또는 유사한 이벤트에서)에 넣을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top