ASP.NET MVC, 페이지에 프로필이없는 등록 된 사용자를 리디렉션하는 방법은 무엇입니까?
-
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 (시작 요청 또는 유사한 이벤트에서)에 넣을 수 있습니다.