2009-07-14 12 views
0

私は特別なロール「パスワードを変更する必要があります」とASP.NETロールを使用しています。ユーザーが90日以上パスワードを変更していない場合は、自動的にこの役割に追加されます。これは、ユーザーのログイン処理中に発生します。承認ルールは、「パスワードの変更」ページを除くすべてのアプリケーションへの役割へのアクセスを拒否します。ASP.NET問題Cookieでロールをキャッシュする

通常、これはうまくいきますが、役割キャッシュCookieを使用して役割をキャッシュすると問題が発生します。ログイン処理中に何が起こるか、最後に変更されたパスワードがチェックされ、90日を超えると、ユーザーは「パスワードを変更する必要があります」役割に追加されます。同じページ要求では、その後、ユーザーを[パスワードの変更]ページにリダイレクトするかどうかを決定するために、Roles.IsUserInRole(「パスワードを変更する必要があります」)を呼び出します。これが落ちる場所です。ロールキャッシュCookieを有効にすると、Roles.IsUserInRole( "パスワードを変更する必要があります")は、このユーザーのロールマッピングを変更したことを認識せず、falseを返します。ただし、次のページ要求では、Roles.IsUserInRole( "パスワードを変更する必要があります")がtrueを返します。

この動作は、cacheRolesInCookie = "false"と設定することで修正されますが、これは有料の代償と思われます。この問題を解決する別の方法はありますか?

答えて

0

実際には、問題を発見しました。クッキーでの役割のキャッシュではなく、Roles.IsUserInRole()での問題です。オーバーロードRoles.IsUserInRole(username、role)を使用すると、クッキーにキャッシュされたロールの有無にかかわらず正常に動作します。

0

同じリクエストに問題があると言われているので、HttpContext.Current.Itemsコレクション内の項目を設定して、ユーザーがパスワードを変更する必要があることを示し、CookieとHttpContext.Current後でコードの.Itemsコレクション?

1

もう一つは、私見よりエレガントな、解決策は、ユーザー(read more on RolePrincipal.SetDirty)に新しいロールを追加した後RolePrincipalHttpContext.UserをキャストしSetDirtyメソッドを呼び出すことです。

次のIsInRoleまたはGetRolesForUserメソッドの呼び出しは、デフォルトのRoleProviderへの要求をトリガする必要があります。

関連する問題