HttpContext.Current.User.IsInRole не работает - PullRequest
4 голосов
/ 24 января 2012

в моем контроллере AuthController / signin у меня есть этот код:

    entities.UserAccount user = (new BLL.GestionUserAccount()).authentifier(email, password);
            //storing the userId in a cookie
            string roles = (new BLL.GestionUserAccount()).GetUserRoles(user.IdUser);
            // Initialize FormsAuthentication, for what it's worth

            FormsAuthentication.Initialize();

            //

            FormsAuthentication.SetAuthCookie(user.IdUser.ToString(), false);

            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
            1, // Ticket version
            user.IdUser.ToString(), // Username associated with ticket
            DateTime.Now, // Date/time issued
            DateTime.Now.AddMinutes(30), // Date/time to expire
            true, // "true" for a persistent user cookie
            roles, // User-data, in this case the roles
            FormsAuthentication.FormsCookiePath);// Path cookie valid for

            // Encrypt the cookie using the machine key for secure transport
            string hash = FormsAuthentication.Encrypt(ticket);
            HttpCookie cookie = new HttpCookie(
               FormsAuthentication.FormsCookieName, // Name of auth cookie
               hash); // Hashed ticket



                // Get the stored user-data, in this case, our roles

            // Set the cookie's expiration time to the tickets expiration time
            if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;

            // Add the cookie to the list for outgoing response
            Response.Cookies.Add(cookie);
            return RedirectToAction("index", "Home");

на главной странице у меня есть меню, в этом меню есть пункт, который должен видеть только роль администратора.

     <% if (HttpContext.Current.User.IsInRole("admin")){ %>

            <%=Html.ActionLink("Places", "Places", "Places")%>
        <%} %>

, даже если HttpContext.Current.User объединяет нужные роли, элемент не отображается:

enter image description here

globalx asax:

    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        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;

                    // Get the stored user-data, in this case, our roles
                    string userData = ticket.UserData;
                    string[] roles = userData.Split(',');
                    HttpContext.Current.User = new GenericPrincipal(id, roles);
                }
            }
        }
    }

Ответы [ 5 ]

5 голосов
/ 17 февраля 2013

Вместо использования User.IsInRole(), попробуйте статический метод Roles.IsUserInRole().

1 голос
/ 24 января 2012

Я знаю, это звучит глупо, но по вашему изображению я могу видеть только ваш userData из вашего билета.

Единственное, что я могу подумать, если, если userData не входит в основной. (Возможно, проблема с последними тремя строками glabal.asax.cs)

Что-то здесь не так:

string userData = ticket.UserData;
string[] roles = userData.Split(',');
HttpContext.Current.User = new GenericPrincipal(id, roles);
1 голос
/ 24 января 2012

Вам потребуется пользовательский атрибут Authorize, который будет анализировать часть пользовательских данных в билете аутентификации и вручную создавать IPrincipal.Взгляните на этот пост , который иллюстрирует способ, которым я бы порекомендовал вам сделать это в ASP.NET MVC.Никогда не используйте HttpContext.Current в приложении ASP.NET MVC.Даже в ваших взглядах.Вместо этого используйте <% if (User.IsInRole("admin")) { %>.

0 голосов
/ 27 марта 2015

В global.asax назначьте принципала на 2 таких объекта:

    private static void SetPrincipal(IPrincipal principal)
    {
        Thread.CurrentPrincipal = principal;
        if (HttpContext.Current != null)
        {
            HttpContext.Current.User = principal;
        }
    }

Я нашел это здесь Документация ASP.NET

0 голосов
/ 29 ноября 2013

Одно утверждение отсутствует.

После этой строки:

FormsAuthenticationTicket ticket = id.Ticket;

Вам необходимо поставить эту строку:

ticket = FormsAuthentication.Decrypt(ticket.Name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...