2

目前在登录时,我将用户的一行插入到 AccessSession 表中,该表保留了用户具有哪些角色的详细信息以及 ASP.NET_SessionId cookie。

我的 GetRolesForUser 方法的自定义实现是:

public override string[] GetRolesForUser(string username)
    {
        List<string> roles = new List<string>();
        string[] rolesArray;
        char[] splitter = { '|' };            

        string sessionId = HttpContext.Current.Request.Cookies["ASP.NET_SessionId"].Value;
        AccessSession sessionObject = AccessSession.Get(sessionId);

        if (sessionObject != null)
        {
            rolesArray = sessionObject.Roles.Split(splitter);

            foreach (string role in rolesArray)
            {
                if (!String.IsNullOrEmpty(role))
                {
                    roles.Add(role);
                }
            }
        }
        return roles.ToArray();
    }

我的问题是我使用这种方法错了吗?如果 cookie 被禁用,那么将没有 HttpContext.Current.Request.Cookies["ASP.NET_SessionId"]。我的替代计划是在 Session 中插入一个 AccessSession 对象,但是当自定义 RoleProvider 尝试访问它时,它总是显示为空。

我可以使用 cacheRolesInCookie=true 但同样不会比上述方法更好,因为禁用 cookie 会破坏功能。

谢谢,理查德

4

1 回答 1

3

好吧,我最终通过从已经拥有我所有角色的 FormsAuthenticationTicket 中获取角色来设法解决它。以下是代码示例:

public override string[] GetRolesForUser(string username)
    {
        List<string> roles = new List<string>();
        string[] rolesArray = new string[] { };
        char splitter = Advancedcheck.BLL.Common.Const.default_splitter;

        if (HttpContext.Current.User != null)
        {
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                if (HttpContext.Current.User.Identity is FormsIdentity)
                {
                    FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
                    FormsAuthenticationTicket ticket = id.Ticket;

                    rolesArray = ticket.UserData.Split(splitter);

                    HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id, rolesArray);
                }
            }
        }

        if (rolesArray.Length > 0)
        {
            foreach (string role in rolesArray)
            {
                if (!String.IsNullOrEmpty(role))
                {
                    roles.Add(role.ToLower());
                }
            }
        }
        return roles.ToArray();
    }
于 2012-04-18T14:17:52.600 回答