web-dev-qa-db-ja.com

User.IsInRoleが機能しない

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

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

23
Bartosz

同様の問題がありました。私の場合、ログオフして再度ログインすると問題は解決しました。

19
Cem Mutlu

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

19
Pažout

追加してみましたか

[InitializeSimpleMembership]

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

6
xfan

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

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

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

5
MattSull

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

5
Marcos R

同様の問題がありました。認証モジュールがSimpleMembershipProviderと完全に関連付けられていないようです。この問題を回避するには、Roleクラスを使用して必要な情報にアクセスします。たとえば、ロールでの使用を確認するには、以下を使用できます。

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

SimpleMembershipProviderロールで作業する場合のその他の便利なメソッド:

   Roles.RoleExists("Developer")
   Roles.CreateRole("Developer");
   Roles.AddUserToRole("sergey", "Developer");
3
Sergey

最新のIdentityフレームワークを使用している場合は、以下を使用しているかどうかを確認してください

services.AddIdentity<IdentityUser,IdentityRole>()
        .AddEntityFrameworkStores<WebUserContext>()
        .AddDefaultTokenProviders();

AddDefaultIdentityを使用している場合、ロールは入力されません。

services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<WebUserContext>()
        .AddDefaultTokenProviders();
2
Ashok B

これらの答えはどれもうまくいきませんでしたが、私はここで答えを見つけました: https://thinkthencode.wordpress.com/2016/04/24/Azure-ad-using-app-roles-for-authorization/

キーは以下をStartup.Auth.csに追加することでした:

TokenValidationParameters = new TokenValidationParameters
{
    RoleClaimType = "roles"
}
1
agressen

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

<modules>
    <remove name="FormsAuthenticationModule" />
    <remove name="RoleManager" /> <!--add this to web config-->
</modules>
1
Radovan

このアカウントの "EmailConfirmed"はおそらくまだfalseです。trueに変更してみてください

Database Screenshot

1
ViniBH

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

ログインしたままでもセッションの有効期限が切れていないか確認してみてください

1
pollirrata

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

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

_this.RoleClaimType = System.Security.Claims.ClaimTypes.Role;
_

これで、以前はロールに所属していたユーザーがもう存在しないことがわかり、再度追加する必要があります。 AspNetUserClaimsテーブルを見ると、RoleのClaimTypeと必要な ' http://schemas.Microsoft.com/ws/2008/06/identity/claims/role 'が表示されます。後で。

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

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

1
VFein

このコードをGlobal.asaxに貼り付けます

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
        {
            HttpCookie authCookie =
                Context.Request.Cookies[FormsAuthentication.FormsCookieName];
            if (authCookie != null)
            {
                FormsAuthenticationTicket authTicket =
                    FormsAuthentication.Decrypt(authCookie.Value);
                string[] roles = authTicket.UserData.Split(new Char[] { ',' });
                GenericPrincipal userPrincipal =
                    new GenericPrincipal(new GenericIdentity(authTicket.Name), roles);
                Context.User = userPrincipal;
            }
        }

        protected class RolesAttribute : AuthorizeAttribute
        {
            public RolesAttribute(params string[] roles)
            {
                Roles = String.Join(",", roles);
            }
        }

私はしばらくの間、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);

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

0
JSideris