26

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

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

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

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

4

6 に答える 6

38

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

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

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

編集:

ブログはもう存在しません。アーカイブは、こちらの Web アーカイブにあります

ブログからの要約:

既存の 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);
于 2011-07-07T00:19:30.670 に答える
10

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

于 2009-07-03T17:38:57.050 に答える
3

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

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

于 2009-07-01T17:42:37.120 に答える
2

たぶん、別のCookieを作成することもできます...私は個人的に認証Cookieをいじりません。

于 2009-07-01T17:41:38.337 に答える
0

余分なユーザーデータをCookieに保存するということは、リクエストごとにクライアントとの間で送受信される、より大きなCookieを意味します。

心配している余分なデータベースヒットを回避するためのより良いアプローチは、ユーザーがログインした後にそのデータをメモリにキャッシュすることです。

ASP.NETには、要求ごとのキャッシュHttpContext.Current.ItemsとアプリドメインキャッシュHttpContext.Current.Cacheがあります。この場合、HttpContext.Current.Cacheを探していると思います。

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

于 2012-10-24T02:06:50.290 に答える