MVC 3饼干不工作
我使用MVC网站的表单身份验证,我有一个问题,添加饼干,我使用加密的表单身份验证票并将其添加到Cookie,但在检查我的饼干时,它是在那里(由命名“AuthCookie”),但价值总是空和过期日期始终设置为“01/01/0001 00:00” ......这是我的登录控制器代码:MVC 3饼干不工作
[HttpPost]
public ActionResult Index(Login login, string returnUrl)
{
if (ModelState.IsValid)
try
{
User user = UserManager.Login(login.Username, login.Password);
string serialUser = Serialize.SerializeToString(user);
string ticket = FormsAuthentication.Encrypt(
new FormsAuthenticationTicket(1, login.Username, DateTime.Now, DateTime.Now.AddMinutes(20.0), login.RemeberMe, serialUser));
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, ticket) { Expires = DateTime.Now.AddMinutes(20) };
Response.Cookies.Add(cookie);
if (String.IsNullOrEmpty(returnUrl))
return RedirectToAction("Index", "Home");
else
return Redirect(returnUrl);
}
catch (LoginFailedException)
{
ModelState.AddModelError("", "Login failed: Invalid Username or Password.");
return View(login);
}
else
return View(login);
}
起初我以为由于长度的原因,加密的字符串不工作,但我已经通过创建一个简单的测试库来测试了这一点,并且我得到了相同的结果。
谁能帮
当你呼叫重定向()或RedirectToAction(),你终止响应,因此Cookie不会发送到客户端。某些解决方案:
- 使用TempData将信息持续存储在直接页面中,将Cookie写入您重定向到的操作中。
- 查看表单身份验证Cookie信息写入NerdDinner code on CodePlex的方式。
- 正如评论中所述,您可以在Session中保留角色信息。将角色信息存储在Session中并从角色中检索(如果未找到)的建议可能会奏效,但我会先按照原样使用成员资格系统,然后再调整性能,如果发现问题存在,而不是假定它会成为问题。
我现在正在使用上面提到的自定义角色提供程序,这已经很好地解决了我的角色问题。作为regrads设置我的身份验证票,我看着书呆子晚餐的例子(谢谢你),它看起来像这只是设置身份验证cookie的方式是: 验证用户... 设置身份验证Cookie .. 重定向到请求的原始页面... – 2012-01-10 11:21:05
@JonGalloway。解决方案编号为3的问题是,您无法通过“AuthenticateRequest_handler”进行会话,通常用于设置Thread.CurrentPrincipal(您需要角色)。 – tggm 2012-07-24 10:48:56
是否有你没有使用FormsAuthentication.SetAuthCookie()的原因? – rfmodulator 2012-01-02 00:13:26
使用SetAuthCookie()你没有访问userData ...我将用它来存储UserRole和其他可选数据IPrincipal和IIdentity – 2012-01-02 00:15:52
我明白了。我不确定是否将角色数据存储在客户端上是一个好主意。 :)加密或以其他方式。 – rfmodulator 2012-01-02 00:17:35