4

Asp.net MVC Web サイトに基本的な認証システムがあります

[HttpPost]
public ActionResult Login(LoginViewModel model, string returnUrl)
{
    WebSecurity.Login(model.UserName, model.Password, persistCookie: false)

    return RedirectToAction("Index", "Home");
}

また、UserInfoViewModelユーザー固有の情報を保持するクラスもあり、それをさまざまなページで使用しています。

UserInfoViewModel必要なたびに作成するのを避けるために、Session on Login メソッドに保存したいと思います。

public ActionResult Login(LoginViewModel model, string returnUrl)
{
   WebSecurity.Login(model.UserName, model.Password, persistCookie: false)
   var userInfoViewModel = new UserInfoViewModel();
   Session["userInfo"] = userInfoViewModel;

    return RedirectToLocal(returnUrl);
}

UserInfoViewModelのような内部に依存する機密情報があることを考えると、IsSuperuserそのオブジェクトをセッションに保持しても安全ですか? ユーザー ログイン セッションが期限切れになると期限切れになりますか?

解決

System.Security.Principal.IIdentityまさにそのために作られています。必要なカスタムユーザー情報を AUTH Cookie 内に保存するため、毎回再計算する必要はありません。

カスタム プリンシパル オブジェクトを使用するビデオ チュートリアル

回答ありがとうございます。

4

1 に答える 1

7

はい、セッションはサーバーに保存されるので安全です。しかし、ASP.NET セッションを使用することに決めた場合は、別の問題について考慮する必要があります。このセッションが Web サーバーのメモリに格納されている場合 (デフォルト)、IIS はいつでもアプリケーションをリサイクルする可能性があり、このセッション データは失われます。一方、ユーザーは引き続き送信されるフォーム認証 Cookie によって追跡されるため、ユーザーは引き続き認証されます。そのため、Sessions を使用する場合は、アウトプロセス セッション プロバイダー (StateServerまたは などSQLServer) に切り替えることをお勧めします。

また、@Mikeb がコメント セクションで指摘しているように、セッションには別の非常に深刻な問題があります。特定のコントローラーの読み取りおよび書き込みモードで有効にした場合、同じセッションからの複数の要求を並行して処理することはできません。サーバーはそれらをブロックし、順次処理します。たとえば、同じセッションからの複数の AJAX リクエストを考えてみてください。それらはすべてブロックされ、順次処理されます。

于 2013-02-08T13:27:27.157 に答える