13

たくさん検索した後、私は何の答えも得られず、最終的に私はあなたに戻らなければなりませんでした。以下に私の問題を詳しく説明します。長すぎるので、読むのをやめないでください。私は自分の問題を簡単な言葉で説明しました。

私はasp.netmvcプロジェクトを開発しています。標準のASP.NETの役割とメンバーシップを使用しています。すべてが正常に機能していますが、rememberme機能はまったく機能しません。私は仕事のすべての詳細をリストしています。皆さんが私がこの問題を解決するのを手伝ってくれることを願っています。

私は単にこれが必要です:

ユーザーがWebアプリケーションにログインする必要があります。ログイン中、彼らは私を覚えているか、それなしでログインすることができます。ユーザーがremembermeを使用してログインした場合、ブラウザーにそれらを長期間記憶させたいと思います。たとえば、少なくとも1年またはかなり長い時間です。彼らがwww.dotnetspider.com、www.codeproject.com、www.daniweb.comおよび他の多くのサイトでそれを行う方法。ユーザーが私を覚えていない状態でログインした場合、ブラウザはWebサイトへのアクセスを約20〜30分間許可し、その後セッションが期限切れになるはずです。ユーザーがログインし、ログアウトせずにブラウザをシャットダウンすると、セッションも期限切れになります。

注:ユーザー用に独自のタルブを作成し、データベーステーブルに対して認証し、他のプロジェクトでCookieとセッションを設定することにより、標準のasp.netロールとメンバーシップを使用せずに上記の機能を正常に実装しました。ただし、このプロジェクトでは、最初から標準のasp.netの役割とメンバーシップを使用していました。私たちはそれが機能すると思っていましたが、テスト時にすべてが構築された後、機能しませんでした。そして今では、既存の機能を標準のasp.netの役割に置き換えたり、メンバーシップを自分のカスタムユーザーテーブルやその他すべてのものに置き換えたりすることはできません。

標準のasp.netロールとメンバーシップ機能に何らかのバグがあるか、標準のasp.netロールとメンバーシップの概念全体が間違っています。私は私が上に欲しいものを述べました。とてもシンプルでリーズナブルだと思います。

私がしたこと

  1. ユーザー名、パスワードを入力してフォームにログインし、フィールドを覚えておいてください。
  2. web.configの設定:

    <authentication mode = "Forms">
    <forms loginUrl = "〜/ Account / LogOn" timeout = "2880" />
    </ authentication>

  3. 私のコントローラーアクションでは、私はこれを持っています:

    FormsAuth.SignIn(userName、rememberMe);

    public void SignIn(string userName、bool createPersistentCookie){FormsAuthentication.SetAuthCookie(userName、createPersistentCookie); }

現在、問題は次のとおりです。

私はすでに上記のセクションで「私は単にこれが必要です」と述べました。ユーザーはシステムに正常にログインできます。それらのセッションは、web.configのタイムアウト値で指定されている分だけ存在します。web.configのサンプルも提供しました。私のサンプルでは、​​タイムアウトを5分に設定すると、ユーザーセッションは5分後に期限切れになります。これで問題ありません。ただし、ユーザーがブラウザを閉じて再度開いた場合でも、「タイムアウト」で指定された時間が経過するまで、ログインせずにWebサイトにアクセスできます。タイムアウト値のスライディング有効期限も正常に機能しています。これで、ユーザーが[覚えている]をオンにしてシステムにログインした場合でも、ユーザーセッションは5分後に期限切れになります。これは良い行動ではありませんね。つまり、ユーザーが「私がチェックしたことを覚えて」でシステムにログインした場合、彼はそうしないまで長い間覚えておく必要があります。tシステムからログアウトするか、ユーザーがブラウザからすべてのCookieを手動で削除しません。ユーザーが覚えていない状態でシステムにログインした場合、web.configで指定されたタイムアウト期間の値の後にセッションが期限切れになることを確認しました。また、ユーザーがブラウザーを閉じた場合も同様です。問題は、ユーザーがブラウザを閉じて再度開いた場合でも、ログインせずにWebサイトにアクセスできることです。

私はこのトピックについてインターネットをよく検索しますが、解決策を得ることができませんでした。まったく同じトピックについてScottGuが作成したブログ投稿(http://weblogs.asp.net/scottgu/archive/2005/11/08/430011.aspx )。スコット氏からの簡単な解決策はありませんが、ユーザーはコメントで同じことについて不満を言っています。

私は次の場所でそれを読みました: http: //weblogs.asp.net/scottgu/archive/2005/11/08/430011.aspxhttp: //geekswithblogs.net/vivek/archive/2006/09/14/91191。 aspx

これは多くのユーザーの問題だと思います。スコット・グー氏のブログ投稿からもわかるように。

あなたの助けは本当にありがたいです。前もって感謝します。

4

5 に答える 5

26

あなたがしたいことは、RememberMeオプションがチェックされているときとチェックされていないときとで異なるタイムアウトを持つことです。残念ながら、SetAuthCookieメソッドでは有効期限を手動で設定できないため、自分で設定する必要があります。

問題は、それをどのように行うかです。

ASP.NET MVCは、System.Web.SecurityのFormsAuthenticationクラスを使用してこれを実行します。これは、構成設定、Cookieなしのブラウジング、およびSSLもサポートする場合は簡単ではないためですが、単純にこれを実行すると、次のようになります。

int timeout = rememberMe ? 525600 : 30; // Timeout in minutes, 525600 = 365 days.
var ticket = new FormsAuthenticationTicket(userName, rememberMe, timeout);
string encrypted = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);
cookie.Expires = System.DateTime.Now.AddMinutes(timeout);// Not my line
cookie.HttpOnly = true; // cookie not available in javascript.
Response.Cookies.Add(cookie);

...必要なものの基本バージョンを入手できます。

注:このコードはテストしていません。

于 2010-03-16T07:58:28.560 に答える
4

ケビンとデイブ、君たちはロック、男。

デイブ、あなたのコードに加えて、私はそれを機能させるためにもう1行追加しなければなりませんでした。少なくとも1年間は覚えておくつもりです。cookie.Expiresに値を割り当てて、コードを機能させる必要がありました。この行のcookie.Expiresが設定されていない場合、コンピューターの再起動後にCookieが失われます。つまり、セッションの終了時です。私はFireFoxでこれに気づきました。cookieの詳細を調べたところ、次のことがわかりました。cookie.Expiresが設定されていない場合、Firefoxの「Expires:」属性の値は「セッションの終了時」ですが、cookie.Expiresが設定されている場合、「Expires」の値はFirefoxの: "属性は、cookie.Expires値が設定された日時です。

コードは次のとおりです。

int timeout = createPersistentCookie ? 525600 : 2; // Timeout in minutes,525600 = 365 days
var ticket = new FormsAuthenticationTicket(userName,createPersistentCookie,timeout);            
string encrypted = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);
cookie.Expires = System.DateTime.Now.AddMinutes(timeout);//My Line
HttpContext.Current.Response.Cookies.Add(cookie);

みんなありがとう、それは本当に素晴らしい解決策でした。

于 2010-03-16T11:29:03.633 に答える
4

その問題でここに着陸する可能性のある人のために、共有環境でメンバーシップ認証チケットを使用することについての簡単なメモ。godaddyでMVCサイトを実行していて、覚えておくのに問題がありました。これが解決策でした:

<system.web>
<machineKey
  validationKey="4C6404A3B305CD6E8CFEAC258F042FB95E45E9C3C2CEC3AAB838996CFBE661E41DF1A1BAC75B9B45E02147612FD9B71CA74DDA50B0D0D6ED11F0BB8E31048953"
  decryptionKey="BC471CF17A97B08A9DF85C7B502AD95680E3BE4418FD9C6CEA57E7F97ED64291"
  validation="SHA1" decryption="AES"
/>

おかげで:http: //www.geekfreeq.com/aspnet-remember-me-option-forms-authentication-not-working/

于 2010-07-04T19:51:40.760 に答える
1

それは問題ではありません、それは機能です:)

ユーザーのセッションはまだ期限切れになっていないため、ユーザーがブラウザーを閉じて再度開いた場合でも、Cookieは正常です。

ユーザーのセッションを無効にするのはCookieの有効期限です。

于 2010-03-16T07:45:44.977 に答える
0

私は同じことを実装しましたが、それをテストすると、Mozilaで正常に動作しますが、すべてのPCのIE8で動作しません。また、IEでCookieを受け入れるように設定を更新しましたが、まだ動作しません。

Internet Explorer 8.x

  1. [ツール]メニューをクリックします。
  2. メニューで[インターネットオプション]を選択します-新しいウィンドウが開きます。
  3. ウィンドウの上部にある[プライバシー]タブをクリックします。
  4. ウィンドウの[デフォルト]ボタンをクリックします。
  5. スライダーを動かして、中高(中、低、すべてのCookieを受け入れるを含む)より下のレベルのいずれかになります。
  6. [OK]をクリックして変更を保存します。
  7. これで、ショッピングカートにアイテムを追加できるようになります。
于 2010-06-28T07:33:55.103 に答える