2009-07-19 10 views
42

ログインの認証Cookieを設定するためにaspxとc#を使用しています。FormsAuthentication.SetAuthCookieを使用してさらに情報を保存する

FormsAuthentication.SetAuthCookie(UserName, True) 

さらに詳しい情報を同じCookieに保存したいとします。この認証Cookieに値を追加できますか、または2番目のhttp Cookieを使用する必要がありますか?

基本的に私はので、私は、キー

おかげで、 エデン

答えて

47

はその後、クッキーを自分で生成し、FormsAuthenticationTicketにユーザーデータを追加することができます。

the MSDN documentation for FormsAuthenticationTicketに例があります。チケットを作成するとき、あなたは一般的にあなたがweb.configファイルで設定した値と同じになりたいでしょうタイムアウトを設定する必要があること

EDIT

注意。残念ながら、フレームワーク3.5以前では、FormsAuthenticationクラスはこのタイムアウトを公開しません。回避策は、this connect feedback itemへの応答で説明されている方法のいずれかを使用してください。フィードバック項目を接続し

UPDATE

は悲しいことに、もはやありません。そのテクニックが何であるか簡単に説明して欲しいですか?

はい、Microsoftが過去のConnectのアイテムを破棄したのは残念です。 IIRC、彼らが提案二つの技術は以下の通りであった。

  1. 使用WebConfigurationManager関連する構成セクションを読んで、タイムアウト値を取得します。

  2. FormsAuthentication.GetAuthCookieを使用してCookieを作成し、FormsAuthentication.Decryptを使用して復号化し、生成されたFormsAuthenticationTicketを検査します。

FormsAuthentication.Timeoutプロパティがある場合は、.NET 4.xにアップグレードするか、アップグレードします。

は、詳細はthis questionを参照してください

+0

ありがとう!これはまさに私が探していたものです! FormsAuthentication.SetAuthCookieの動作が重複しているようですが、asp.net 3.5(私はリフレクタを使用する時間がありません)と少ししか違いがありません。 Cookieに任意のデータを添付することができます(名前だけでなく)。 ありがとうございました! – Eden

+0

フィードバックの項目を接続することはもはや悲しいことではありません。このテクニックが何であるか簡単に説明して欲しいですか? –

+1

.NET 4.xでは、新しいチケットを作成するときにFormsAuthentication.Timeoutを使用する方法は次のようになります。DateTime.Now.Add(FormsAuthentication.Timeout) –

1

は、ユーザ名としてそのユーザIDを渡し、ユーザーテーブルの行を使用してデータベースにアクセスすることができるかもしれユーザーズIdを保存するために離れて探していますparam。

FormsAuthentication.SetAuthCookie(userId, True) 

どのようにして認証チケットを確保していますか?

+5

名前の_instead_を渡したくありません。同じ認証Cookieにさらにデータを追加したいと思います。それはまったく可能ですか? – Eden

+1

@Edenあなたは同じ問題を解決しましたか?同じチケットを使用していますが、userIdとロールを同じチケットに保存するにはどうすればいいですか? – rogue39nin

15

認証クッキーに必要な情報を入れておくと便利です。つまり、機密情報を置く場合は、少なくとも暗号化する必要がありますが、機密情報をそこに置くことをお勧めします。

Forms.SetAuthCookie (UserName + "|" + UserId, true); 

次に、ユーザー名またはユーザーIDが必要なときはいつでもそうです。単にクッキーをロードし、必要な値を解析してください。

もう一度、これは特に上記の通りです。です。つまり、可能です。あなたは、バックアウトデータをプルするアクセサメソッドを作成する必要があります。

public int CurrentUserId 
{ 
    get 
    { 
     int userId = 0; 

     if (HttpContext.Current.Request.IsAuthenticated) 
     { 
      userId = Convert.ToInt32(HttpContext.Current.User.Identity.Name.Split('|')[1]); 
     } 

     return userId; 
    } 
} 

public string CurrentUserName 
{ 
    get 
    { 
     string userName = string.Empty; 

     if (HttpContext.Current.Request.IsAuthenticated) 
     { 
      userName = HttpContext.Current.User.Identity.Name.Split('|')[0]; 
     } 

     return userName; 
    } 
} 
+0

私がここに示した方法は "便宜的な"方法であり、うまくいくことに注意してください。しかし、システム全体への影響を小さくするためには、Joeが提示したアプローチを使用します。 – andymeadows

3

はい、それは使用するスマートです「|」詳細を記入する。 Microsoftに別のオーバーロードされたメソッドがある場合

public static void SetAuthCookie(String userName, bool createPersistentCookie, string userData)` 

その後、私たちの生活ははるかに簡単になり、コードはより安全になります。

-1

FormsAuthentication.Timeout.TotalMinutesを使用して、web.configの値に基づいてタイムアウトを設定できます。

+0

質問:「基本的に、ユーザーのIDを格納するために私は離れているので、ユーザーのテーブルの行キーを使用してデータベースにアクセスできる可能性があります。これはリモートでもそれに答えることはありません – nathanchere

+0

あなたはそうです、それは主要な答え(http://stackoverflow.com/a/1150271/1758188)にコメントする必要があります。具体的には、以下のことを実現する方法です。「タイムアウトを設定する必要があります。一般に、web.configで設定された値と同じになりたいです。 –

+0

@nathanchereチルピルマンを取る。彼が与えた情報は、全体的な解決の重要な部分でした。これはSOモデルの弱点の1つです。補助的な議論の重要性を認識していません(定義:補足的または追加のヘルプとサポートを提供する)。これはコードフォーマットなどがない貧弱なコメントシステムに限定されるべきではありません。 –

関連する問題