0

User.Identity.Nameに基づいてユーザーを認証し、役割や最終ログイン日など、SQLServerデータベースからその他の詳細を取得したいと思います。

ログイン後、データベースにアクセスせずに、同じユーザーに後続の呼び出しを許可する必要があります。

ただし、最初のログイン時にユーザー情報をヒットしてロードし、セッションに保存しました。

これが私のSQLテーブルです

ApplicationUser

  • UserId->ここに保存されているWindowsID名のマッピング
  • 表示名
  • RoleId
  • LastLoginDate
  • アクティブです

ログインコントローラロジック

public ActionResult Login()
{
 string userId = User.Identity.Name;
    userId = userId.Substring(userId.IndexOf(@"\") + 1);
    var key = "Roles." + userId;
    var roles = HttpContext.Cache[key]
    if (roles == null)
    {
        User user = AdminService.SelectUser(userId);
        roles = new string[] { user.Role.RoleName };
        HttpContext.Cache.Add(key, roles, null,
            DateTime.Now.AddMinutes(HttpContext.Session.Timeout),
            Cache.NoSlidingExpiration);

        HttpContext.User = Thread.CurrentPrincipal = new
                    GenericPrincipal(User.Identity, roles);
        HttpContext.Session["LoggedInUser"] = user;
    }
}

また、MVC3の各リクエストでユーザーを承認するための以下のコードがあります

void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
{
if (User.Identity.IsAuthenticated)
{
    string userId = User.Identity.Name;
    userId = userId.Substring(userId.IndexOf(@"\") + 1);
    var key = "Roles." + userId;
    var roles = HttpContext.Cache[key];
    if (roles != null)
    {
        HttpContext.Current.User =
            Thread.CurrentPrincipal =
                new GenericPrincipal(User.Identity, roles);
    }
}
}

しかし、セッションに格納されているUserオブジェクトにアクセスしているときに問題が発生するため、上記のロジックを変更することをお勧めします。なんでそんな感じなのかわかりません。

上記の混合認証を行うための他の可能なコード/ロジックを持っている人はいますか?

編集:他のコントローラーメソッドでHttpContext.Session["LoggedInUser"]にアクセスするときにエラーが発生していました。

4

1 に答える 1

1

セッションに保存されているユーザーオブジェクトにアクセスしているときに問題が発生したためです。

セッションに情報を保存していません。キャッシュに保存しています。それはあなたの問題だ。キャッシュは、アプリケーションのすべてのユーザー間で共有されます。したがって、を使用する代わりに、を使用HttpContext.CacheできますHttpContext.Session

セッションとキャッシュを使用する代わりに、この投稿で説明したように、フォーム認証 Cookie の UserData 部分にこの情報を格納することもできます。

于 2013-01-21T13:18:38.733 に答える