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"]にアクセスするときにエラーが発生していました。