3

すぐに使用できる Web フォーム認証を使用します。

「ログアウト」のリクエストの後、次を使用します。

 FormsAuthentication.SignOut();

ユーザーは、クライアント ブラウザーから Cookie ".aspxauth" を削除することによってログアウトされます。

これは期待どおりに機能します。

私たちのサイトはセキュリティ監査を受け、監査人は、ユーザーがログアウトしたときに認証トークンがサーバーから削除されないと主張しました.

Fiddler を使用して、この動作を再現できます。

  • サイトにログインし、Cookie「.aspxauth」をコピーします
  • ログアウト: クライアントで Cookie が削除され、保護されたページにアクセスできなくなりました
  • 以前にコピーした Cookie「aspxauth」を使用して、fiddler composer を使用してサイトにリクエストを送信します。その Cookie で保護されたページにアクセスできます。

予想される結果は、ログアウトすると、古い aspxauth Cookie を提供することによって保護されたページにアクセスできなくなることです。

サーバー上の古い aspxauth Cookie を無効にする方法はありますか?

4

1 に答える 1

3

ログイン時にユーザーのデータベースにも保存される Auth-cookie にソルト値を保存することで、これを解決しました。

リクエストごとに、認証 Cookie のソルトがデータベースのソルトと同じかどうかがチェックされます。そうでない場合、ユーザーはログアウトされます。

ユーザーがログアウトすると、salt がデータベースから削除され、古い認証 Cookie は使用できなくなります。

ログイン時にSaltを保存する

    // Generate a new 6 -character password with 2 non-alphanumeric character.
string formsAuthSalt = Membership.GeneratePassword(6, 2);

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
    orderAuthToken.EMail,
    DateTime.Now,
    DateTime.Now.AddMinutes(20),
    ApplicationConfiguration.CreatePersistentCookie,
    formsAuthSalt,
    FormsAuthentication.FormsCookiePath);

// Encrypt the ticket.
string encTicket = FormsAuthentication.Encrypt(ticket);
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));


UserInfo user = UserService.GetUser(orderAuthToken.EMail);
user.FormsAuthenticationCookieSalt = formsAuthSalt;
UserService.UpdateUser(user);

アレルアクションをデコライトするフィルターのソルトを確認してください

public class CheckFormsAuthenticationCookieSalt : ActionFilterAttribute
{
    private readonly IUserService UserService = ObjectFactory.GetInstance<IUserService>();

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if ( filterContext.HttpContext.Request.IsAuthenticated)
        {
            // Encrypt the ticket.
            if (HttpContext.Current.Request.Cookies.AllKeys.Contains(FormsAuthentication.FormsCookieName))
            {
             var cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
                if (cookie != null)
                {
                    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
                    if (ticket != null)
                    {
                        string salt = ticket.UserData;
                        int userID = UserService.GetUniqueID(filterContext.HttpContext.User.Identity.Name, true, false, "MyAppName");
                        UserInfo user = UserService.GetUser(userID);
                        //for deployment: dont logg out existing users with no cookie
                        if (user.FormsAuthenticationCookieSalt != salt && user.FormsAuthenticationCookieSalt != "seed")
                        {
                            FormsAuthentication.SignOut();
                            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "action", "Index" }, { "controller", "Home" } );
                        }
                    }
                }
            }
        }

        base.OnActionExecuting(filterContext);
    }
}
于 2014-11-21T12:31:50.877 に答える