如何在使用 cookie 时将 Request.IsAuthenticated 设置为 true
本文关键字:IsAuthenticated Request 设置 true 时将 cookie | 更新日期: 2023-09-27 18:35:42
我认为我描述的问题很常见,但我找不到任何可以帮助我的解决方案。我创建了一个 ASP.NET MVC项目,但我想创建自己的身份验证系统,而不是内置的身份验证系统,因为我已经有一个包含用户信息(用户名,电子邮件地址,密码等)的数据库。
我想使用 FormsAuthentication 并将其连接到我自己的数据库,我认为我已经这样做了,但是每次向应用程序发送新请求时,Request.IsAuthenticated 属性始终设置为 false。
这是我使用的代码:
// GET: /Account/Login
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
//
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
using (var db = new dbEntities())
{
var result = db.Person.Any(x => x.Email == model.Email && x.Password == model.Password);
switch (result)
{
case true:
FormsAuthentication.SetAuthCookie(model.Email, true);
resetRequest();
return RedirectToLocal(returnUrl);
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
}
private void resetRequest()
{
var authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (authTicket != null && !authTicket.Expired)
{
var roles = authTicket.UserData.Split(',');
System.Web.HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(authTicket), roles);
}
}
}
它工作得很好,在resetRequest()方法被调用之前,IsAuthentication值被设置为false,在它被调用之后,它被设置为true。问题是,当我通过返回重定向到本地(returnUrl)重定向到主页时,该属性再次为假,我不知道该怎么做才能将其设置为true。
我是否必须在控制器中每个方法的开头调用像 resetRequest() 这样的方法?我不认为这是一个优雅的解决方案。谁能帮我?
通过将以下方法添加到 Global.asax 来解决:
protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
{
var authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (authTicket != null && !authTicket.Expired)
{
var roles = authTicket.UserData.Split(',');
System.Web.HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(authTicket), roles);
}
}
}
我想仍然不是最好的方法...
我建议你阅读 asp.net 过滤器,特别是关于 Controller.OnAuthorization。
这是您在 mvc 中处理授权操作的标准方式 asp.net。
设置身份验证cookie应该就足够了,您是否在web.config中将身份验证模式设置为表单?
我认为
,你应该在web.conf中添加一些配置
<system.web>
............
......
<authentication mode="Forms">
<forms loginUrl="~/Login/UserLogin" timeout="2880" />
</authentication>
</system.web>