我认为我所描述的问题很常见,但我找不到任何可以帮助我的解决方案。我创建了一个ASP.NET MVC项目但是我不想创建自己的内置身份验证系统,因为我已经有一个包含用户信息的数据库(用户名,电子邮件地址,密码等)
我想使用FormsAuthentication并将其连接到我自己的数据库,我假设我已经完成了,但每次我向应用程序发送新请求时,Request.IsAuthenticated属性始终设置为false。 / p>
这是我正在使用的代码:
// 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()方法之前,IsAuthenticated值设置为false,在调用它之后设置为true。问题是,当我通过返回RedirectToLocal(returnUrl)重定向到主页面时,该属性再次为false,我不知道如何将其设置为true。
我是否必须在控制器中的每个方法的开头调用resetRequest()等方法?我不认为这是一个优雅的解决方案。谁能帮帮我呢?
答案 0 :(得分:3)
通过向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);
}
}
}
我认为仍然不是最好的方法......
答案 1 :(得分:0)
我建议你阅读asp.net filters, 尤其是关于Controller.OnAuthorization。
这是您在asp.net mvc中处理授权操作的标准方法。
答案 2 :(得分:0)
设置auth cookie应该足够了,您是否已将身份验证模式设置为web.config中的表单?
答案 3 :(得分:0)
我认为,你应该在web.conf中添加一些配置
<system.web>
............
......
<authentication mode="Forms">
<forms loginUrl="~/Login/UserLogin" timeout="2880" />
</authentication>
</system.web>