28

ASP.NET MVC 4 アプリケーションがあります。ログインフォームの下にあるチェックボックスを記憶できるシンプルなメンバーシッププロバイダーを使用しています。チェックを入れると、ログイン日から 100 日で有効期限が切れる永続的な Cookie .ASPXAUTH が作成されます。そして、アプリケーションのメインメニューを除いて、すべてが正常に機能します。

メニューの一部は、管理者ユーザーのみが使用できます。私が使う:

@if (User.IsInRole("Administrator")) { @Html.Partial("_MainMenuPartial") }

通常のユーザーに対してレンダリングされないようにロックします。このアプローチは、システムにログインした直後にうまく機能します。しばらくして戻ってきて、永続的な Cookie を使用して認証すると、ログインできますが、

@User.IsInRole("Administrator")

「False」を返すため、管理メニュー項目が表示されません。同時に

@User.Identity.Name

適切なログイン名を返し、

@User.Identity.IsAuthenticated

「True」を返します。これは、永続的な Cookie が正常に機能することを証明しています。ユーザーがシステムによって認証されているにもかかわらず、ユーザー ロールにアクセスできないのはなぜですか?

4

18 に答える 18

25

私は似たような問題を抱えていました。私の場合、ログオフして再度ログインすると問題は解決しました。

于 2014-10-30T14:05:35.330 に答える
21

MVC5 でのロールの使用に関する問題

解決策を見つけました。私のweb.configで:

<modules>
    <remove name="FormsAuthenticationModule" />
    <remove name="RoleManager" />
</modules>

remove name="RoleManager" 行を追加すると、新しい AspNet.Identity コードが引き継ぎ、User.IsInRole(..) を使用できるようになりました。

http://forums.asp.net/t/1952572.aspx?Problem+using+roles+with+MVC5

于 2015-07-09T18:54:31.350 に答える
8

古い質問ですが、ここにはいくつかの情報がありません。私も同じ問題に遭遇しましたが、注意すべき点が 1 つあります。認証の直後に (クライアントに応答を送信せずに)ユーザー ID ( User.IsInRole("admin") など) をテストすると、ID フレームワークはまだこのセッション情報を入力していません(または、少なくとも、方法を見つけることができませんでした)。それを行う)。要求しているこの情報は、コントローラーが戻った後のある時点で入力されます。ユーザーの役割に応じて、(IE) ログイン後に別のビューにリダイレクトする場合は、カスタム認証フィルターを使用する必要があります。

于 2016-05-24T11:06:59.377 に答える
6

追加してみましたか

[InitializeSimpleMembership]

チェックを行っているコントローラーで?

于 2013-12-26T09:17:53.917 に答える
5

IsUserInRolefalseを返すことで同様の問題がありました。その上に時計を置くことで、以下に説明するオーバーロードを使用して問題を克服できました。試してみて、false になっているところにブレークポイントを置いて、何が起こるか見てみましょう。

@if (Roles.IsUserInRole(Model.UserName, "Administrator"))

User.Identity.Name最初のパラメーターとしても使用できると確信しています。

于 2013-03-26T23:26:46.720 に答える
3

同様の問題がありました。認証モジュールが SimpleMembershipProvider と完全に接続されていないようです。この問題を回避するには、Role クラスを使用して必要な情報にアクセスします。たとえば、役割で使用されているかどうかを確認するには、次を使用できます。

Roles.GetRolesForUser("sergey").Contains("Developer")

SimpleMembershipProvider ロールを使用する場合のその他の便利なメソッド:

   Roles.RoleExists("Developer")
   Roles.CreateRole("Developer");
   Roles.AddUserToRole("sergey", "Developer");
于 2013-03-23T18:45:19.627 に答える
2

Brock Allen の IdentityManager を使用してロールを作成し、ユーザーに割り当てる場合は、次の記事をお読みください: https://github.com/IdentityManager/IdentityManager.AspNetIdentity/issues/3

次の行のコメントを解除する必要があります。

this.RoleClaimType = System.Security.Claims.ClaimTypes.Role;

これで、以前は役割に含まれていたユーザーがもはや役割に含まれていないことがわかり、それらを再度追加する必要があります。AspNetUserClaims テーブルを見ると、ロールの claimType と、後で必要な ' http://schemas.microsoft.com/ws/2008/06/identity/claims/role ' が表示されます。

これを行うと、User.IsInRole("rolename")期待どおりに動作します。

これが誰かの役に立てば幸いです。これを理解するのにしばらく時間がかかりました。

于 2015-11-10T07:21:26.083 に答える
1

同様の問題がありましたが、私の場合、問題はセッションタイムアウトが認証タイムアウトと同期されなかったため、自動的に追い出されませんでしたが、セッションが期限切れになり、許可された操作がセッション変数に保存されたためです。 、現在のユーザーの正しいオプションを取得できませんでした。

まだログインしている場合でも、セッションの有効期限が切れていないかどうかを確認してください

于 2013-03-26T23:37:14.743 に答える
1

かなり古いトピックですが、vs 2015 Web フォーム アプリケーションの動作ソリューションで確認できます。

<modules>
    <remove name="FormsAuthenticationModule" />
    <remove name="RoleManager" /> <!--add this to web config-->
</modules>
于 2015-10-30T12:11:37.053 に答える
0

私はしばらくの間、MVC5 ロール マネージャーに苦労してきました。User.IsInRoleが同時に異なる結果を返す可能性があることを確認しましたが、これは明らかに、Userオブジェクトがキャッシュされており、無効化する必要があるためです。これを行う 1 つの方法は、ログアウトして、ここで指定された回答の 1 つとして再度ログインすることです。新しいロールを追加するコントローラーにこれを投げるだけです:

        UserManager.AddToRole(User.Identity.GetUserId(), "Administrator");

        var updatedUser = await UserManager.FindByNameAsync(User.Identity.Name);
        var newIdentity = await updatedUser.GenerateUserIdentityAsync(UserManager);
        AuthenticationManager.SignOut();
        AuthenticationManager.SignIn(newIdentity);

ただし、ユーザーがアプリケーションを他のウィンドウで開いている場合、すべてのウィンドウが更新されるわけではありません。

于 2016-04-28T00:34:12.880 に答える
-1

ユーザーの前にページを追加します。これは機能します: Page.User.IsInRole("Administrator")

于 2015-11-16T20:09:12.540 に答える