ASP .NET自定义RoleProvider不尊重cacheRolesInCookie =“真”A

2019-05-12 08:44发布

我已经实现了一个自定义角色提供商,并在像这样我的web.config文件进行配置的:

<roleManager enabled="true" defaultProvider="TDRoleProvider" cacheRolesInCookie="true">
  <providers>
    <clear/>
    <add name="TDRoleProvider" type="TDRoleProvider"/>
  </providers>
</roleManager>

我已经覆盖了GetRolesForUser功能在我的自定义角色提供商,我已经走进它,它工作得很好 - 负载高达60个角色我与测试用户。 不过,我已经注意到,GetRolesForUser被调用每个调用User.IsInRole请求。 在我写的其他应用程序,它仅调用一次,然后高速缓存结果在cookie中。 出于某种原因,缓存工作不为这个应用程序。 任何想法,为什么?

Answer 1:

http://connect.microsoft.com/VisualStudio/feedback/details/104688/rolemanager-cacherolesincookie-option-does-not-work

“当缓存(或不缓存)在RolePrincipal问题通过一些设计迭代的去了,我们终于只为通过IPrincipal接口(即IsInRole)公开的方法缓存解决。”



Answer 2:

我有同样的问题。 在我的情况的问题是,我设置Context.User到的GenericPrincipal而不是RolePrincipal。 因此,而不是:

this.Context.User = new GenericPrincipal(customIdentity, roles);

这个固定的对我来说:

            HttpCookie roleCookie = this.Context.Request.Cookies[Roles.CookieName];
            if (IsValidAuthCookie(roleCookie))
            {
                this.Context.User = new RolePrincipal(customIdentity, roleCookie.Value);
            }
            else
            {
                this.Context.User = new RolePrincipal(customIdentity);
                var x = this.Context.User.IsInRole("Visitor"); // do this to cache the results in the cookie
            }

为空,空的IsValidAuthCookie方法检查:

    private static bool IsValidAuthCookie(HttpCookie authCookie)
    {
        return authCookie != null && !String.IsNullOrEmpty(authCookie.Value);
    }

更新:升级到MVC5 .NET 4.5后roleManager停止工作(不保存在cookie的作用),因此不得不把它保存自己:

        HttpCookie roleCookie = filterContext.HttpContext.Request.Cookies[Roles.CookieName];
        if (IsValidAuthCookie(roleCookie))
        {
            filterContext.Principal = new RolePrincipal(customIdentity, roleCookie.Value);
            RolePrincipal rp = (RolePrincipal)filterContext.Principal;
            if (!rp.IsRoleListCached) // check if roles loaded properly (if loads old cookie from another user for example, roles won't be loaded/cached).
            {
                // roles not loaded. Delete and save new
                Roles.DeleteCookie();
                rp.IsInRole("Visitor"); // load Roles
                SaveRoleCookie(rp, filterContext);
            }

        }
        else
        {
            filterContext.Principal = new RolePrincipal(customIdentity);
            filterContext.Principal.IsInRole("Visitor"); // do this to cache the results in the cookie.
            SaveRoleCookie(filterContext.Principal as RolePrincipal, filterContext);
        }

保存roleCookie

    private void SaveRoleCookie(RolePrincipal rp, AuthenticationContext filterContext)
    {
        string s = rp.ToEncryptedTicket();
        const int MAX_COOKIE_LENGTH = 4096;
        if (string.IsNullOrEmpty(s) || s.Length > MAX_COOKIE_LENGTH)
        {
            Roles.DeleteCookie();
        }
        else
        {
            HttpCookie cookie = new HttpCookie(Roles.CookieName, s);
            cookie.HttpOnly = true;
            cookie.Path = Roles.CookiePath;
            cookie.Domain = Roles.Domain;
            if (Roles.CreatePersistentCookie)
                cookie.Expires = rp.ExpireDate;
            cookie.Secure = Roles.CookieRequireSSL;
            filterContext.HttpContext.Response.Cookies.Add(cookie);
        }
    }

放在AuthenticationFilter此代码,并在全球注册。 见这里 。



Answer 3:

同样是我真实的。 它不断给你打电话GetRolesForUser()



文章来源: ASP .NET Custom RoleProvider not respecting cacheRolesInCookie=“true”