質問

ユーザーのニックネームやユーザー ID (テーブルの主キー) などのデータを認証 Cookie のユーザー データ セクションに保存したいと考えています。これを行う理由は、ブラウザを閉じたときにユーザーが再ログインすることなく、このデータを保持するためです。

編集:おっと!自分のことをうまく説明できていなかったことに気づきました。Cookie に基づいてユーザーを再認証しようとしているわけではありません。ユーザーは すでに ASP.Net のメンバーシップ システムによって認証されている - この部分は問題ありません。私の問題は、たとえばユーザーのニックネームを表示したい場合、別の SQL クエリを実行して、それをセッションに保存する必要があることです。私は、この情報を UserData セクションの認証 Cookie (これも ASP.Net によってすでに作成されているもの) に保存することが合理的であると考えました。これは、この目的のために作成されたものと思われます。

プロファイル データを含む独自のユーザー テーブルがあり、軽量のソリューションが必要だったので、プロファイルを使用したくありません。

認証 Cookie のユーザー データ セクションでこのデータをエンコードする良い方法は何ですか?連載も考えていましたが、それはやりすぎかもしれません。私のやり方は間違っているのでしょうか?

役に立ちましたか?

解決

これを行う方法については、ここに詳細なチュートリアルを書きました。

http://www.danharman.net/2011/07/07/storing-custom-data-in-forms-authentication-tickets/

これにより、暗号化と認証が維持され、json を使用してクラスが UserData フィールドにシリアル化されます。

編集:

ブログはもう存在しません。アーカイブは見つかります ここのウェブアーカイブで.

ブログからの要約:

既存の Cookie と認証チケットを取得します

HttpResponse response = HttpContext.Current.Response;
bool rememberMe = true;
var cookie = FormsAuthentication.GetAuthCookie(name, rememberMe);
var ticket = FormsAuthentication.Decrypt(cookie.Value);

カスタム データを定義します (これが JSON にシリアル化可能であることを確認してください)

var userData = new YourUserClass(...);

データと既存の認証チケット設定を使用して新しい認証チケットを作成します

var newTicket = new FormsAuthenticationTicket(ticket.Version, 
    ticket.Name, 
    ticket.IssueDate, 
    ticket.Expiration, 
    ticket.IsPersistent, 
    userData.ToJson(), //This is where you'd set your user data
    ticket.CookiePath);
var encTicket = FormsAuthentication.Encrypt(newTicket);

カスタマイズしたチケットを Cookie に設定し、レスポンスに追加します

cookie.Value = encTicket;
response.Cookies.Add(cookie);

他のヒント

どうやら私は正しい道を進んでいたようです。 http://www.asp.net/learn/security/tutorial-03-vb.aspx (ステップ 4:ステップ 4:追加のユーザー データをチケットに保存する)

はい。ユーザー ID とログインを Cookie に保存している場合、誰かが自分の Cookie を他人のユーザー ID とログインに変更するのを妨げているのは何ですか?

認証チケット システムを設定する必要があります。基本的に、これはセッションが存在しないときにチェックされる Cookie 値です。値が存在する場合は、ユーザー ID を含むチケット テーブルに対してその値を実行します。チケットを見つけたらセッションしてみよう そして新しいチケット.

プロファイル情報を含むユーザー テーブルがすでにある場合は、次のコマンドを使用してそれにフックしてみてはいかがでしょうか。 カスタムプロファイルプロバイダー.

このようなものを実装する方法の別の例が必要な場合は、以下を参照してください。 SQLテーブルプロファイルプロバイダー

別のクッキーを作成することもできるかもしれません...私は個人的には認証 Cookie をいじりたくありません。

追加のユーザー データを Cookie に保存すると、リクエストごとにクライアントからより大きな Cookie が送受信されることになります。

懸念される追加のデータベース ヒットを回避するためのより良いアプローチは、ユーザーがログインした後にそのデータをメモリにキャッシュすることです。

ASP.NET にはリクエストごとのキャッシュ HttpContext.Current.Items とアプリ ドメイン キャッシュ HttpContext.Current.Cache があります。このインスタンスでは HttpContext.Current.Cache を探していると思います。

あるいは、Web サーバー (負荷分散された Web サーバー) 全体でキャッシュする必要がある場合は、memcached、redis、Velocity、ncache などのサードパーティのキー値ストアを調べることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top