2011-12-27 11 views
6

メンバーシッププロバイダは、暗号化されたCookieにユーザー名と有効期限を格納し、それを使ってユーザーがまだセッションにログインしていることを確認しています。ASP.NetセッションCookieのユーザーパスワードを保存しますか?

この暗号化されたCookieにユーザーのパスワードを保存することも可能でしょうか。もしそうなら、それをどのようにサーバー側にアクセスしますか?

私は、同じ資格情報を使用するWebサービスを呼び出す必要があるため、サーバー側で利用できるユーザー名とパスワードが必要です。これを行うにはよりよい方法がありますか?

答えて

10

サーバーを決して離れないセッション状態で保存する必要があります。

また、プレーンテキストでパスワードを保存することは決してお勧めできないため、パスワード(OAuthなど)ではなく認証チケットを使用するようにWebサービスを変更するようにしてください。

+2

ユーザーが最初に認証されたときにセッション状態に保存できますか?メンバーシップセッションがセッション状態と同時に期限切れになることをどうやって確認しますか?私は彼らが私が信じている同期にとどまることが必要です。 –

+0

@metalideath - はい、できるだけ早くそれらを保管してください。セッションが終了すると、ユーザーがCookieをクリアしてセッションの参照を失うか、またはサーバーがセッションをタイムアウトすると、ユーザーを再認証してセッションでパスワードを再度復元する必要があります。 – Omar

+0

複数のサーバー環境でセッション状態が機能していますか? –

2

FormsAuthenticationTicket.UserDataを使用することはできますが、お勧めしません。

+0

私が言うことができる限り、SLaksが推薦しているものと同じものではありませんか?私は本当にメンバーシップ提供セッションと "セッション状態"の違いを理解していません。おそらく違いはなく、それが私を混乱させるものです。 –

+0

@metalideath。セッションCookieはForms認証Cookieとは大きく異なります。完全な理解のためにStefan Schackowの書籍の「フォーム認証」の章を読んでください。 –

+0

@metalideath:これはクライアント上のフォーム認証クッキーに直接入ります。私はそれをお勧めしません。 – SLaks

3

はい、できます。あなたは、FormsAuthenticationTicketのコンストラクタののuserdataフィールドでエンコードされた情報渡す:

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(version, 
    name, issueDate, expirationDate, isPersistent, yourEncodedData); 
    string secureTicket = FormsAuthentication.Encrypt(ticket); 
    Response.Cookies.Add(
     new HttpCookie(FormsAuthentication.FormsCookieName, secureTicket)); 

理想的には、これは、SSL接続を介して行われる必要がありますが、チケットクッキーは両方のHttpOnlyおよびSecure属性でマークする必要があります。値を取得するために、次に

、:

FormsIdentity id = (FormsIdentity)User.Identity; 
FormsAuthenticationTicket ticket = id.Ticket; 
string yourEncodedInfo = ticket.UserData; 

また、単にフォームから認証チケットを分離し、独自のクッキーを設定することができます。

しかし、たとえ暗号化されていても、クッキーに直接パスワードを格納することは、セキュリティの観点からはお勧めできません。代わりに、セッション状態を使用します。

Session["password"] = password; 

セッション状態はまた、クッキーを使用しますが、クッキー自体は、キーが含まれています。サーバーはキーを使用して、そのセッションに固有のキー/値のペアの辞書を取得します。このキー/値のペアは、サーバー上に残ります(または構成方法によってはDBにシリアル化されます)。

+0

セッション状態の使用例をありがとう、+1 。 –

関連する問題