2

ASP.NET MVC でメンバーシップを機能させようとしています。認証が必要なページがいくつかあります。ゲストと承認されたメンバーを持つことができるその他。StackOverflow によく似ています。彼らは匿名で、または登録ユーザーとして物事を行うことができます.

また、メンバーを処理するためのカスタム データベース スキーマもあります (既定の ASP.NET メンバーシップの方法ではありません)。だから私は自分のメンバーシップ/プリンシパルコードを書くことを検討しています。これまでのところうまく機能していますが、セッションの有効期限が切れて「記憶」機能を実装できないという問題があります。

FormsAuthentication.SetAuthCookie(username, rememberMe) を使用してフォーム Cookie を設定しますが、ユーザーが 20 分間マシンを離れるか、IIS がセッション ダイをリサイクルし、非常に一貫性のないユーザー状態になると言います。

「Remember me」Cookie はどこで取得できますか? また、ユーザーの再ログインをどのように処理しますか? 基本的に、ユーザー名とパスワードを保存してから、Application_BeginRequest などで Cookie を探しますか?

4

1 に答える 1

4

私が正しく読んだ場合、ASP.NET が永続的な認証 Cookie を検出し、そのユーザーの最後のセッション状態を再確立することを期待しているようです。そのようには機能しません: 認証 Cookie と asp.net セッションは 2 つの独立したものであるため、実際には、ユーザーがサイトに戻って永続的な AuthCookie を介して認証を渡すインスタンスが発生しますが、新しい (空)セッションデータ。

AuthCookie が適切に設定されていると仮定すると、User.Identity.IsAuthenticatedIIS のリサイクルやセッションの期限切れの影響を受けないユーザーが認証されていることを検出できます。ユーザー名は で公開されUser.Identity.Nameます。

ユーザーがサイトに戻ったときに一部のセッションデータを再初期化する必要がある場合は、手動で行う必要があります。これが本当にあなたの求めているものである場合、あなたのアプリについて詳しく知らなければ答えるのは難しいですが、global.asaxのSession_Startとイベントを考えてみてください。Session_Endまたは、セッションオブジェクトをnullチェックして、空になるたびに(セッションが期限切れになった後)再入力することもできます。次に例を示します。

//get some user info from session or db if session is null
string preferredName;
if (User.Identity.IsAuthenticated)
{
    object o = Session["preferredName"];
    if (o == null)
    {
        preferredName = repository.GetUser(User.Identity.Name).PreferredName;
        Session["preferredName"] = preferredName; //save to session so this isn't necessary next time
    }
    else
    {
        preferredName = (string)o;
    }
}
else
{
    preferredName = "anon";
}
于 2009-10-21T17:40:07.080 に答える