3

私はこのようなものを持っています:

FormsAuthentication.SetAuthCookie(user, false);
var tmp = Roles.IsUserInRole("administrator");
var _tmp = Roles.IsUserInRole(user, "administrator");

tmp常にfalseであり、_tmp常にtrueです。なぜtmp間違っているのですか?

4

3 に答える 3

3

ログインアクション中にこれを実行しているため、ユーザーはまだログインしていないと見なすのが安全です。したがって、UserオンHttpContext(コントローラーからthis.Userまたは単にアクセス可能User)は認証されていないプリンシパルに設定されます。RolescurrentUser.Identity.Nameを使用してユーザー名を取得し、ロールを取得するため、この場合、2番目のオーバーロードを使用する必要があります。

何らかの理由で最初のオーバーロードを使用する必要がある場合は、ユーザーを更新する必要があります。

User = new GenericPrincipal(new GenericIdentity(user, "forms"), new string[0]);

通常、FormsAuthモジュールは、ユーザーがログイン後に次にページにアクセスしたときに、認証チケットCookieを読み取り、それを復号化し、チケットにある名前を使用してUser新しいGenericPrincipalを作成することにより、適切に更新します。FormsIdentity

于 2013-01-29T18:16:58.007 に答える
2

var tmp = Roles.IsUserInRole("administrator");は、現在ログインしているユーザーがロールに含まれているかどうかvar _tmp = Roles.IsUserInRole(user, "administrator");を確認userし、がロールに含まれているかどうかを確認し、その時点でログインしているかどうかを確認します。そしてFormsAuthentication.SetAuthCookie(user, false);、次のリクエストまで有効にならないuserので、実際にはまだログインしていません。

于 2013-01-29T18:17:02.417 に答える
1

SetAuthCookieはCookieのみを設定します。ログインしたり、ユーザー情報を読み込んだりすることはありません。

次の要求でCookieが読み取られ、ASP.NETは要求処理パイプラインの一部として役割とIDを構成します。

これをバイパスすることはできますが、基本的には、すべて1つの要求に対してasp.net認証コードを複製することを意味します。ユーザーをリダイレクトしてページをリロードする方がおそらく簡単です。

于 2013-01-29T18:42:20.087 に答える