web-dev-qa-db-ja.com

ASP.Netはユーザーデータを認証Cookieに保存します

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

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

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

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

26
Donnie Thomas

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

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);
36
DanH

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

10
Donnie Thomas

プロファイル情報を含むユーザーテーブルを既に持っている場合は、 カスタムプロファイルプロバイダー を使用してテーブルに接続してみませんか。

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

3

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

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

3
Spencer Ruport

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

2
Eric Nicholson

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

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

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

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

0
Steven Quick