私はこのようなものを持っています:
FormsAuthentication.SetAuthCookie(user, false);
var tmp = Roles.IsUserInRole("administrator");
var _tmp = Roles.IsUserInRole(user, "administrator");
tmp
常にfalseであり、_tmp
常にtrueです。なぜtmp
間違っているのですか?
私はこのようなものを持っています:
FormsAuthentication.SetAuthCookie(user, false);
var tmp = Roles.IsUserInRole("administrator");
var _tmp = Roles.IsUserInRole(user, "administrator");
tmp
常にfalseであり、_tmp
常にtrueです。なぜtmp
間違っているのですか?
ログインアクション中にこれを実行しているため、ユーザーはまだログインしていないと見なすのが安全です。したがって、User
オンHttpContext
(コントローラーからthis.User
または単にアクセス可能User
)は認証されていないプリンシパルに設定されます。Roles
currentUser.Identity.Name
を使用してユーザー名を取得し、ロールを取得するため、この場合、2番目のオーバーロードを使用する必要があります。
何らかの理由で最初のオーバーロードを使用する必要がある場合は、ユーザーを更新する必要があります。
User = new GenericPrincipal(new GenericIdentity(user, "forms"), new string[0]);
通常、FormsAuthモジュールは、ユーザーがログイン後に次にページにアクセスしたときに、認証チケットCookieを読み取り、それを復号化し、チケットにある名前を使用してUser
新しいGenericPrincipal
を作成することにより、適切に更新します。FormsIdentity
var tmp = Roles.IsUserInRole("administrator");
は、現在ログインしているユーザーがロールに含まれているかどうかvar _tmp = Roles.IsUserInRole(user, "administrator");
を確認user
し、がロールに含まれているかどうかを確認し、その時点でログインしているかどうかを確認します。そしてFormsAuthentication.SetAuthCookie(user, false);
、次のリクエストまで有効にならないuser
ので、実際にはまだログインしていません。
SetAuthCookieはCookieのみを設定します。ログインしたり、ユーザー情報を読み込んだりすることはありません。
次の要求でCookieが読み取られ、ASP.NETは要求処理パイプラインの一部として役割とIDを構成します。
これをバイパスすることはできますが、基本的には、すべて1つの要求に対してasp.net認証コードを複製することを意味します。ユーザーをリダイレクトしてページをリロードする方がおそらく簡単です。