欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Asp.net mvc验证用户登录之Forms实现详解

程序员文章站 2022-06-23 11:13:51
这里我们采用asp.net mvc 自带的authorizeattribute过滤器验证用户的身份,也可以使用自定义过滤器,步骤都是一样。 第一步:创建asp.net m...

这里我们采用asp.net mvc 自带的authorizeattribute过滤器验证用户的身份,也可以使用自定义过滤器,步骤都是一样。

第一步:创建asp.net mvc项目, 在项目的app_start文件夹下面有一个filterconfig.cs,在这个文件中可以注册全局的过滤器。我们在文件中添加authorizeattribute过滤器如下:

public class filterconfig
 {
  public static void registerglobalfilters(globalfiltercollection filters)
  {
   filters.add(new handleerrorattribute());
   //将内置的权限过滤器添加到全局过滤中
   filters.add(new system.web.mvc.authorizeattribute());
  }
 }

第二步:在web.config配置文件中修改网站的身份认证为mode="forms"

<system.web>
 <!--cockie名称,当用未登入时跳转的url-->
 <authentication mode="forms">
  <forms name="xcookie" loginurl="~/login/index" protection="all" timeout="60" cookieless="usecookies"></forms>
 </authentication>
 <compilation debug="true" targetframework="4.5" />
 <httpruntime targetframework="4.5" />
 </system.web>


提示:配置name值作为最终生成的cookie的名称,loginurl指定当用户未登入是跳转的页面,这里挑战到登入页面

第三步:添加用户登入相关的控制器和视图

创建logincontroller控制器:

public class logincontroller : controller
 {
  [httpget]
  [allowanonymous]
  public actionresult index()
  {
   return view();
  }

  [httppost]
  [allowanonymous]
  public actionresult login(user user) 
  {
   if (!user.username.trim().equals("liuxin") || !user.password.trim().equals("abc"))
   {
    modelstate.addmodelerror("", "用户名或密码错误");
    return view("index", user);
   }
   //if (!user.username.trim().equals("liuxin")) {
   // modelstate.addmodelerror("username", "用户名错误");
   // return view("index", user);
   //}
   //if (!user.password.trim().equals("abc")) {
   // modelstate.addmodelerror("password", "密码错误");
   // return view("index", user);
   //}
   user.id = guid.newguid().tostring("d");//为了测试手动设置一个用户id
   formsauthhelp.addformsauthcookie(user.id, user, 60);//设置ticket票据的名称为用户的id,设置有效时间为60分钟
   return redirect("~");
  }
  [httpget]
  public actionresult logout() {
   formsauthhelp.removeformsauthcookie();
   return redirect("~/login/index");
  }
 }

特别注意:index和login这两个方法得使用“[allowanonymous]”指明这两个方法可以匿名访问,否则由于过滤器不允许匿名访问,导致登入页面和用户提交都无法进行。显然这不是我们希望看到的。

提示:为了测试方便这边的用户的数据是写死的,用户的id也是临时生成了一个

public class user
 {
  public string id { get; set; }
  public string username { get; set; }
  public string password { get; set; }
 }

创建登入视图:

@{
 layout = null;
 viewbag.title = "index";
}
<h3>您尚未登入,请登入</h3>
@using(html.beginform("login", "login", formmethod.post))
{
 @html.label("username", "用户名:")@html.textbox("username", null, new { id = "username", placeholder = "请输入用户名" })
 @html.validationmessage("username")<br/>
 @html.label("password", "密 码:")@html.textbox("password", null, new { id = "password", placeholder = "请输入密码" })
 @html.validationmessage("password")<br/>
 <input type="submit" value="登入" /> <input type="reset" value="重置" />
 @html.validationsummary(true)
}

提示:当检测到用户未登入,则跳转到web.config中配置的url页面,当用户填写密码并提交时,用户输入的数据会提交到logincontroller控制器下的login方法,验证用户的输入,认证失败重新返回到登入界面,当认证成功,将会执行

<<***formsauthhelp.addformsauthcookie(user.id, user, 60);//设置ticket票据的名称为用户的id,设置有效时间为60分钟***>>,这条语句的作用是生成一个ticket票据,并封装到cookie中,asp.net mvc正式通过检测这个cookie认证用户是否登入的,具体代码如下

第四步:将用户信息生成ticket封装到cookie中

public class formsauthhelp
 {
  /// <summary>
  /// 将当前登入用户的信息生成ticket添加到到cookie中(用于登入)
  /// </summary>
  /// <param name="loginname">forms身份验证票相关联的用户名(一般是当前用户的id,作为ticket的名称使用)</param>
  /// <param name="userdata">用户信息</param>
  /// <param name="expiremin">有效期</param>
  public static void addformsauthcookie(string loginname, object userdata, int expiremin)
  {
   //将当前登入的用户信息序列化
   var data = jsonconvert.serializeobject(userdata);

   //创建一个formsauthenticationticket,它包含登录名以及额外的用户数据。
   var ticket = new formsauthenticationticket(1,
    loginname, datetime.now, datetime.now.adddays(1), true, data);

   //加密ticket,变成一个加密的字符串。
   var cookievalue = formsauthentication.encrypt(ticket);

   //根据加密结果创建登录cookie
   //formsauthentication.formscookiename是配置文件中指定的cookie名称,默认是".aspxauth"
   var cookie = new httpcookie(formsauthentication.formscookiename, cookievalue)
   {
    httponly = true,
    secure = formsauthentication.requiressl,
    domain = formsauthentication.cookiedomain,
    path = formsauthentication.formscookiepath
   };
   //设置有效时间
   if (expiremin > 0)
    cookie.expires = datetime.now.addminutes(expiremin);

   var context = httpcontext.current;
   if (context == null)
    throw new invalidoperationexception();

   //写登录cookie
   context.response.cookies.remove(cookie.name);
   context.response.cookies.add(cookie);
  }
  /// <summary>
  /// 删除用户ticket票据
  /// </summary>
  public static void removeformsauthcookie() {
   formsauthentication.signout();
  }
 }

第五步:测试执行

1. 启动网站输入相应的网址:如下图

Asp.net mvc验证用户登录之Forms实现详解

2. 此时用户尚未登入将会跳转到登入界面:如下图

Asp.net mvc验证用户登录之Forms实现详解

3.输入错误的密码会重新跳转到登入界面并提示出错

Asp.net mvc验证用户登录之Forms实现详解

4. 输入正确的用户名密码

Asp.net mvc验证用户登录之Forms实现详解

5.点击用户退出会删除掉cookie所以又会跳转到登入界面。

源码下载地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。