3

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この時点でユーザーを掘り下げてみると、イベントの最後にユーザーがロールを持っていることを確認した直後は、ロールが存在しないように見えます。

この質問にも同様の問題があります。コメントするつもりでしたが、担当者が少ないためにコメントできないと思いますが、これは私だけの問題ではないようです。

私も同様のアプローチを持つこの質問を見ましたが、これは私に同じ結果を与えています。

何が起こっているのかについての提案やコメントはありますか?

4

2 に答える 2

3

Application_OnPostAuthenticateRequestの代わりにハンドラーを使用して、最終的にこれに対する答えを見つけましたApplication_AuthenticateRequest

この回答のおかげです(驚くべきことに、そのスレッドで受け入れられたものではありませんでした!)。ティアゴ・マティアスに感謝!

于 2012-10-26T16:23:40.373 に答える
1

HttpContext.Current.User.IsInRoleの代わりに試してくださいUser.IsInRole

于 2012-10-26T15:02:36.590 に答える