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」を返します。ユーザーがシステムによって認証されているにもかかわらず、ユーザーの役割にアクセスできないのはなぜですか?
同様の問題がありました。私の場合、ログオフして再度ログインすると問題は解決しました。
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
追加してみましたか
[InitializeSimpleMembership]
チェックを行っているコントローラーで?
IsUserInRole
がfalseを返すという同様の問題がありました。その上に時計を置くことで、以下に説明するオーバーロードを使うことで問題を克服することができました。それを試して、あなたが間違っているところにブレークポイントを置き、何が起こるか見てください。
@if (Roles.IsUserInRole(Model.UserName, "Administrator"))
最初のパラメータとしてUser.Identity.Name
も使用できると確信しています。
古い質問ですが、ここに欠けている情報があります。同じ問題に遭遇しましたが、覚えておくべきことが1つあります。認証直後にユーザーID(のようにUser.IsInRole( "admin"))をテストする場合(クライアントに応答を送信せずに)、IDフレームワークこのセッション情報はまだ入力されていません(または、少なくとも、その方法を見つけることができませんでした)。あなたが要求しているこの情報は、コントローラーが戻った後のある時点で入力されます。ユーザーの役割に応じて、ログイン後に別のビューに(つまり)リダイレクトする場合は、カスタム認証フィルターを使用する必要があります。
同様の問題がありました。認証モジュールがSimpleMembershipProviderと完全に関連付けられていないようです。この問題を回避するには、Roleクラスを使用して必要な情報にアクセスします。たとえば、ロールでの使用を確認するには、以下を使用できます。
Roles.GetRolesForUser("sergey").Contains("Developer")
SimpleMembershipProviderロールで作業する場合のその他の便利なメソッド:
Roles.RoleExists("Developer")
Roles.CreateRole("Developer");
Roles.AddUserToRole("sergey", "Developer");
最新のIdentityフレームワークを使用している場合は、以下を使用しているかどうかを確認してください
services.AddIdentity<IdentityUser,IdentityRole>()
.AddEntityFrameworkStores<WebUserContext>()
.AddDefaultTokenProviders();
AddDefaultIdentityを使用している場合、ロールは入力されません。
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<WebUserContext>()
.AddDefaultTokenProviders();
これらの答えはどれもうまくいきませんでしたが、私はここで答えを見つけました: https://thinkthencode.wordpress.com/2016/04/24/Azure-ad-using-app-roles-for-authorization/
キーは以下をStartup.Auth.cs
に追加することでした:
TokenValidationParameters = new TokenValidationParameters
{
RoleClaimType = "roles"
}
かなり古いトピックですが、2015で確認できるWebフォームアプリケーションの動作ソリューション:
<modules>
<remove name="FormsAuthenticationModule" />
<remove name="RoleManager" /> <!--add this to web config-->
</modules>
このアカウントの "EmailConfirmed"はおそらくまだfalseです。trueに変更してみてください
私にも同様の問題がありましたが、私の場合、セッションタイムアウトが認証タイムアウトと同期されなかったため、自動的にキックアウトされず、セッションが期限切れになり、許可された操作がセッション変数に保存されたため、 、現在のユーザーの正しいオプションを取得できませんでした。
ログインしたままでもセッションの有効期限が切れていないか確認してみてください
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")
は期待どおりに動作します。
これが誰かの役に立つことを願っています。これを理解するのにしばらく時間がかかりました。
このコードを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);
ただし、ユーザーが他のウィンドウでアプリケーションを開いている場合、すべてのウィンドウが更新されるわけではありません。