4

我有一个 MVC 应用程序,它是一个 API 文档站点,位于表单 auth 后面站点中实际上只有两个页面...主页,其中列出了(在较高级别)站点上的所有端点,以及数据对象。您可以单击这些数据对象/端点中的任何一个,然后转到详细信息页面。

我的每个页面都装饰有该[Authorize(Roles="role,names,here")]属性。正如预期的那样,当您进入该站点时,您将被重定向到登录页面,并且任何后续请求都可以正常工作。

但是,昨天该网站开始出现问题,我不知道为什么。初始登录后,您请求的页面加载正常。但是,只要您单击链接导航到任何其他页面,用户就会被重定向到登录页面,并且凭据不再起作用。

关于造成这种情况的任何想法,以及如何解决它?

[编辑] 我不知道为什么,但是我的 sessionState 配置在我的 web.config 中被注释掉了(我没有这样做,正如我所说,这是 48 小时前工作的),但似乎没有注释这个修复了它:

<sessionState mode="InProc" customProvider="DefaultSessionProvider">
  <providers>
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="dbConn"/>
  </providers>
</sessionState>
4

1 回答 1

0

最好向我们展示您提供会话的课程。但是使用这个:您将拥有一个像这样的帐户控制器:

UserApplication userApp = new UserApplication();
SessionContext context = new SessionContext();
public ActionResult Login()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Login(User user)
        {
            var authenticatedUser = userApp.GetByUsernameAndPassword(user);//you get the user from your application and repository here
            if (authenticatedUser != null)
            {
                context.SetAuthenticationToken(authenticatedUser.UserId.ToString(),false, authenticatedUser);
                return RedirectToAction("Index", "Home");
            }

            return View();
        }

        public ActionResult Logout()
        {
            FormsAuthentication.SignOut();
            return RedirectToAction("Index", "Home");
        }

你的 SessionContext 将是这样的:

 public class SessionContext
    {
        public void SetAuthenticationToken(string name, bool isPersistant, User userData)
        {
            string data = null;
            if (userData != null)
                data = new JavaScriptSerializer().Serialize(userData);

            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, name, DateTime.Now, DateTime.Now.AddYears(1), isPersistant, userData.UserId.ToString());

            string cookieData = FormsAuthentication.Encrypt(ticket);
            HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieData)
            {
                HttpOnly = true,
                Expires = ticket.Expiration
            };

            HttpContext.Current.Response.Cookies.Add(cookie);
        }

        public User GetUserData()
        {
            User userData = null;

            try
            {
                HttpCookie cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
                if (cookie != null)
                {
                    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);

                    userData = new JavaScriptSerializer().Deserialize(ticket.UserData, typeof(User)) as User;
                }
            }
            catch (Exception ex)
            {
            }

            return userData;
        }
    }
于 2013-03-04T17:16:33.530 回答