3

構築しているASP.NETMVCサイトに「RememberMe」ログイン機能を実装しようとしています。私はこのアプローチhttp://jaspan.com/improved_persistent_login_cookie_best_practice(上部の「ミラーの設計」を参照)を使用して、ある程度機能させようとしています。

したがって、ワークフローは次のようになります。

  1. ユーザーがログインすると、暗号化された安全なランダム文字列とデータベースIDが永続的なCookieとして発行されます(約30日間有効)。安全な文字列は、データベースのユーザーアカウントレコードの横に保存されます。
  2. ユーザーは後でサイトに戻り、ブラウザがログインCookieを提示し、IDとセキュアキーがデータベースで検索され、一致するものが見つかった場合、ユーザーは自動的に認証されます。
  3. 認証されると、新しいセキュアキーが生成され、データベースに保存され、新しいCookieが発行されます。

私はこれを正常に機能させていますが、ユーザーが複数のブラウザーまたはコンピューターからログインした場合はうまく機能しません。明らかに、ブラウザが異なれば、Cookieとして保存される安全なキーも異なるため、ワークフローは次のようになります。

  1. ユーザーはブラウザAからログインし、Cookieとして安全なキーを発行され、キーはデータベースに保存されます。
  2. ユーザーはブラウザBからログインし、Cookieとして別の安全なキーが発行されます。キーもデータベースに保存されますが、ブラウザAから生成されたキーを上書きします。
  3. ユーザーがブラウザAからサイトに再度アクセスすると、ブラウザは手順1で発行されたCookieを表示しますが、手順2で安全なキーが置き換えられたため、一致しなくなったため、ユーザーは再度ログインする必要があります。別の新しいキーが生成され、ブラウザBに発行されたキーを上書きします。
  4. ユーザーがブラウザBから再度アクセスした場合、キーが一致しない場合、再度ログインする必要がある場合など。

どうすればこれを解決できますか?データベースに複数のキーを保存して維持する必要がありますか?私もこれを正しい方法で行っていますか?StackOverflowがこれを管理しているようで、さまざまなブラウザやコンピュータから私を覚えていることに気づきました。

4

2 に答える 2

1

リンクした記事を読むと、Millerの設計では、ランダムな文字列とユーザー名をペアとしてuser-tableとは別のテーブルに格納しているように見えます。ランダムな文字列をインデックスとして使用することにより、セッションハイジャックから十分に保護しながら、同じユーザー名から複数の同時ログインを行うことができます。

あなたの説明は、ランダムな文字列をユーザーテーブル内に保存することを示しています。これにより、一度に1回のログインしか許可されません。

于 2010-11-17T09:34:37.500 に答える
0

Cookieに3番目のアイテムである「シリーズ」トークンが必要です。これはログインイベントを表します。ユーザーがシステムにログインするたびに、新しいシリーズが作成されます。このシリーズは、ログアウトするか、再度ログインするまで変更されません。リクエストごとに更新されるトークン、つまりセキュアキーがまだあります。

この実装に役立つリンクは次のとおりです。

複数のブラウザの永続的なログインを許可する場合のデータベースの問題

フォームベースのWebサイト認証の最も信頼のおけるガイド

于 2012-07-06T04:30:58.610 に答える