asp.net MVC、プロファイルを持たない登録ユーザーをページにリダイレクトするにはどうすればよいですか?
-
21-08-2019 - |
質問
asp.net mvcを使用してサイトを構築しています。ユーザーが簡単に登録してアカウントを作成できるようにしたいと考えています。ただし、彼のプロフィールに登録される非常に特別な情報があり、*登録が完了し、彼が初めてログインした後に、それを彼に見せたいと考えています。
ロジックは、ヒットした URL が何であれ、ユーザーが認証されていて有効なプロファイルを持っていない場合、そのユーザーを「プロファイルの作成」ページにリダイレクトします。
UI 全体は、これらのプロファイルの選択によって決まります。このワークフローを訪問者に強制するには、MVC フレームワーク内でどのようなアプローチを使用する必要がありますか?私が思いつくアイデアは、コントローラーなどで大量のコードの重複を必要とするため、明らかに悪いアイデアです。
ユーザーにはメンバーシップを使用していますが、プロファイルはプロファイル データを userId に接続する独自の実装 (プロファイル プロバイダーなし) です。
解決
私はこれを行う最も簡単な方法は、既存のものを拡張し、カスタムAuthorizeAttributeを作成したり、別のFilterAttributeを作成するのいずれかだと思います。これらのいずれかの一つは、あなたのコントローラのすべてに適用され、認証されたユーザーがプロファイルを持っていることを確認してくださいになるだろう。プロファイルが存在しない場合には、フィルタは、プロファイルが作成されたページにユーザをリダイレクトすることになります。これは、プロファイル作成アクションにRedirectResultにコンテキストに対して結果のプロパティを設定することによって行われることになります。プロファイルが存在し、完了している場合にのみフィルタはユーザが所望のアクションに進むことが可能になります。
または、OnActionExecutingをオーバーライドし、同じタスクを行う基地コントローラを作成することができます。私はそれがより柔軟であるとして属性メカニズム、つまり、あなたは(プロファイル設定アクションを含む)のプロファイルをせずに利用されているいくつかの公共のアクションを持っている可能性を好むます。
他のヒント
私自身の質問に答えると、次のようになります。最後に、カスタムの 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 とリポジトリを使用します。
コミュニティに感謝します。
タグ(これらに要求または同様のイベントを開始します)ではないほとんどのページが他にそうする必要がある場合、または、あなたが実際にGlobal.asaxのために、このリダイレクトロジックを置いてもよいアクションフィルタとフィルタの属性を考慮して試してみてください