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"] はありません。私の別の計画は、AccessSession オブジェクトを Session に挿入することでしたが、カスタム RoleProvider がアクセスしようとすると、これは常に null と表示されます。

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 に答える