2

asp.net mvc を使用してサイトを構築しています。ユーザーが簡単に登録してアカウントを作成できるようにしたいと考えています。彼のプロファイルに登録される非常に特別な情報がありますが、それは*登録が完了し、彼が初めてログインした後に表示したいものです。

ロジックは、ヒットした URL に関係なく、ユーザーが認証され、有効なプロファイルを持っていない場合、ユーザーを「プロファイルの作成」ページにリダイレクトします。

全体の UI は、これらのプロファイルの選択に依存します。このワークフローを訪問者に強制するには、MVC フレームワーク内でどのアプローチを使用する必要がありますか? 私が思いつくアイデアは、コントローラーなどで大量のコードを複製する必要があるため、明らかに悪い考えです。

ユーザーにメンバーシップを使用していますが、プロファイルは、プロファイル データを userId に接続する独自の実装 (プロファイル プロバイダーではありません) です。

4

3 に答える 3

3

これを行う最も簡単な方法は、カスタム AuthorizeAttribute を作成して既存のものを拡張するか、別の FilterAttribute を作成することだと思います。これらのいずれかがすべてのコントローラーに適用され、認証されたユーザーがプロファイルを持つようになります。プロファイルが存在しない場合、フィルターはユーザーをプロファイルが作成されたページにリダイレクトします。これは、コンテキストの結果プロパティをプロファイル作成アクションの RedirectResult に設定することで実行できます。プロファイルが存在し、完全である場合にのみ、フィルターはユーザーが目的のアクションに進むことを許可します。

または、OnActionExecuting をオーバーライドして同じタスクを実行する基本コントローラーを作成することもできます。私はより柔軟な属性メカニズムを好みます。つまり、プロファイルなしで使用できるいくつかのパブリック アクション (プロファイル設定アクションを含む) を使用できます。

于 2009-07-03T14:58:36.703 に答える
2

私自身の質問に答える: 最後に、カスタム 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;
            }
        }
    }
}

プロファイルをセッションキーに保存するという副作用があります。このようにして簡単に取得できるため、他のカスタム フィルターを使用してすべてのリクエストでさらにロール チェックを行うことができます。実装では、データベース アクセスに Unity とリポジトリを使用します。

コミュニティに感謝します。

于 2009-09-28T12:53:11.413 に答える
0

ほとんどのページでそうする必要がない場合は、ActionFilter と FilterAttribute を検討してみてください。または、実際にこのリダイレクト ロジックを global.asax に配置することもできます (これらの Begin Request または同様のイベントで)。

于 2009-07-03T15:00:32.377 に答える