MVCアプリでは、RolesProviderをバイパスして、渡されるCookieにロールをキャッシュするだけです。Application_AuthenticateRequest
インターウェブに関するいくつかの提案に従って、次のようにイベントを活用しています。
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
var user = HttpContext.Current.User;
if (user == null || !user.Identity.IsAuthenticated)
{
return;
}
// read the roles from the cookie and set a custom generic principal
var fi = (FormsIdentity)HttpContext.Current.User.Identity;
var httpCookie = HttpContext.Current.Request.Cookies["Roles"]; // custom cookie set during authentication
if (httpCookie != null)
{
string rolesCookie = httpCookie.Value;
var pmUserRoles = rolesCookie.Split(',');
GenericPrincipal gp = new GenericPrincipal(fi, pmUserRoles);
HttpContext.Current.User = gp;
}
}
私はその方法を段階的に実行し、いくつかの役割を持ついくつかの条件をスローしました。現在のユーザーが設定された直後はUser.IsInRole("rolename")
、魅力のように機能します。
しかし、ビューで同じ呼び出しを行おうとすると、次のようになります。
@if(Request.IsAuthenticated)
{
if (User.IsInRole("role1") || User.IsInRole("role2"))
{
<!-- show something -->
}
else if (User.IsInRole("role3"))
{
<!-- show something else -->
}
}
ロールにアクセスできません。AuthenticateRequest
この時点でユーザーを掘り下げてみると、イベントの最後にユーザーがロールを持っていることを確認した直後は、ロールが存在しないように見えます。
この質問にも同様の問題があります。コメントするつもりでしたが、担当者が少ないためにコメントできないと思いますが、これは私だけの問題ではないようです。
私も同様のアプローチを持つこの質問を見ましたが、これは私に同じ結果を与えています。
何が起こっているのかについての提案やコメントはありますか?