Пользовательский IIdentity и IPrincipal с использованием файла cookie FormsAuthenticationTicket в MVC2 - PullRequest
5 голосов
/ 16 октября 2010

В настоящее время я пытаюсь реализовать некоторую пользовательскую защиту в веб-приложении ASP.NET MVC2.

Я пытаюсь сделать что-то действительно простое, как показывает мой код ниже, но по какой-то причине, если я использую атрибут [Authorize(Roles="Admins")] в одном из моих действий контроллера, отметьте Context.User.IsInRole("Admins") или Page.User.IsInRole("Admins"), это всегда false.

Также странно, что User.Identity.Name также пуст.

См. Мой код ниже, я использую FormsAuthenticationTicket в cookie, который я затем использую в дескрипторе события Application_AuthenticateRequest в моем Gloabl.asax, чтобы установить Context.User с объектом GenericPrincipal.

Мой логин:

[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Login(string username, string password)
        {  

            //this would obviously do a check against the supplied username and password
            if (true)
            {
                FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, username, DateTime.Now,
                DateTime.Now.AddMinutes(15), false, "Admins|Users|Members");

                string encTicket = FormsAuthentication.Encrypt(ticket);

                HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);

                this.Response.Cookies.Add(cookie);
                string url = FormsAuthentication.GetRedirectUrl(username, false);

                Response.Redirect(url);               
            }


            return View();

        }

Мой код Global.asax:

        void MvcApplication_AuthenticateRequest(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            HttpContext context = application.Context;

            var cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName];

            if (cookie != null)
            {                  

                // Get the authentication ticket 
                // and rebuild the principal & identity
                FormsAuthenticationTicket authTicket =
                  FormsAuthentication.Decrypt(cookie.Value);
                string[] roles = authTicket.UserData.Split(new Char[] { '|' });
                GenericIdentity userIdentity = new GenericIdentity(authTicket.Name);
                GenericPrincipal userPrincipal =
                    new GenericPrincipal(userIdentity, roles);

                context.User = userPrincipal;

            }

Как только я установил context.User выше, я могу видеть в окне просмотра, и объект установлен отлично, в правильных ролях с правильным именем и т. Д., Однако, если я пытаюсь заблокировать действия контроллера или использую Принципала из любого места на моем сайте всегда задана пустая строка без назначенных ролей !!

Я предполагаю, что я делаю что-то действительно глупое, но если бы кто-то мог указать на это, я был бы очень признателен.

1 Ответ

2 голосов
/ 16 октября 2010

Убедитесь, что вы назначаете свой новый userPrincipal как для HttpContext, так и для текущего потока в запросе OnPostAuthenticate в global.asax:

HttpContext.Current.User = userPrincipal;
Thread.CurrentPrincipal = userPrincipal;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...