1、常见的应用场景
在网上购物或者实际的使用过程中经常遇到这样的一个场景:你必须输入用户米/密码,进行登录。登录完成后,界面自动跳转到之前的界面或者主页。具体下面的三个图所示。
2、ASP.NET MVC的实现
在ASP.NET MVC中有个功能是身份认证(就是使用用户名和密码登录的问题),以及使用角色登录的功能。
具体代码如下:
2.1 商品列表的代码
点击商品列表中的购买本商品
,界面会进行跳转。界面的代码如下所示:
<h2>商品列表</h2>
<table>
<tr>
<td>商品名称</td>
<td>价格</td>
<td>操作</td>
</tr>
<tr>
<td>测试商品1</td>
<td>100</td>
<td>@Html.ActionLink("购买本产品", "Buy", "Home", new { productid = "001" }, null)</td>
</tr>
<tr>
<td>测试商品2</td>
<td>200</td>
<td>@Html.ActionLink("购买本产品", "Buy", "Home", new { productid = "002" }, null)</td>
</tr>
</table>
2.2 购买方法的权限审核
当2.1中的跳转到Home中的Buy方法时,系统会进行权限认证。Buy方法的代码如下:
[Authorize]
public ActionResult Buy(string productid)
{
return View();
}
代码很简单,就是添加了一个特性。而这个特性的一个功能,就是MVC进行判断,若没有认证,则进行跳转到登录界面。其配置就是在项目的web.config中。
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="2880">
</forms>
</authentication>
</system.web>
而LogOn登录界面就是,上面的第二个图片。LogOn.cshtml
的代码如下:
@model AuthorizeDemo.Models.LogOnModel
@{
ViewBag.Title = "LogOn";
}
@using (Html.BeginForm())
{
<div>
<fieldset>
<legend>Account Information</legend>
<div class="editor-label">
@Html.LabelFor(m => m.UserName)
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.UserName)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.Password)
</div>
<div class="editor-field">
@Html.PasswordFor(m => m.Password)
</div>
<div class="editor-label">
@Html.CheckBoxFor(m => m.RememberMe)
@Html.LabelFor(m => m.RememberMe)
</div>
<p>
<input type="submit" value="Log On" />
</p>
</fieldset>
</div>}
若详细看第二张图片(LogOn.cshtml
)的URL,就会发现其URL是这样的:
http://localhost/AuthorizeDemo/Account/LogOn?ReturnUrl=/AuthorizeDemo/Home/Buy?productid=1&productid=1
即,在LogOn的后面自动添加了原来界面的URL(即ReturnUrl=/AuthorizeDemo/Home/Buy
)以及相关参数。
为什么会自动添加这个呢?查看MVC的源码就会发现,[Authorize]
的处理原理如下:
1、在AuthorizeAttribute
中的OnAuthorization
方法中的逻辑如下:
//判断上下文中是否有用户的登录信息
//若无登录信息后,进行进一步的处理
IPrincipal user = httpContext.User;
if (!user.Identity.IsAuthenticated)
{
return false;
}
//若结果为false,即用户没有登录信息,则将创建一个HttpUnauthorizedResult对象
filterContext.Result = new HttpUnauthorizedResult();
//HttpUnauthorizedResult就是一个401的变体。
context.HttpContext.Response.StatusCode = StatusCode;
if (StatusDescription != null)
{
context.HttpContext.Response.StatusDescription = StatusDescription;
}
2、当[Authorize]
的抛出HttpUnauthorizedResult
异常后,MVC中FormsAuthenticationModule
类中的OnLeave
方法,就会捕捉到这个异常。然后在这个方法的内部,具有重定向的功能。重定向就包含了两个功能:1、web.config中的登录界面配置。2、登录后的ReturnURL。
因此刚才看到的LonOn的URL中包含了ReturnURL的内容。
2.3 登录详细操作
在LogOn.cshtml
界面,点击Log On
登录按钮后,会已POST方式,进行提交到LogOn方法。方法的代码如下:
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
//使用Membership进行创建用户
MembershipCreateStatus createStatus;
Membership.CreateUser(model.UserName, model.Password,"", "question", "answer", true, null, out createStatus);
//以上这部分的代码,应该放在注册方法中实现,这儿为了省事和验证,就统一放在LogOn方法中。
//这样就有个bug,每次登录都会创建一个用户。
//这儿只是为了演示使用,因此把注册的代码,合并待这儿了
//使用Membership的验证功能
if (Membership.ValidateUser(model.UserName, model.Password))
{
//设置cookie
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
//判断ReturnURL是否满足条件,若满足条件,则重定向到;否则,转到主页上
if ( Url.IsLocalUrl(returnUrl) &&
returnUrl.Length > 1 &&
returnUrl.StartsWith("/")&&
!returnUrl.StartsWith("//") &&
!returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
return View(model);
}
上面的代码中,使用了Membership进行创建用户、验证用户等操作。那问题来了,Membership怎么创建?把用户又保存到哪里了?怎么能够看到呢?
2.4 Membership
Membership是把用户信息保存到数据库了。是保存到SQL Server LocalDB数据库了。这个数据库是跟随VS安装,自动安装了。所以Membership直接把数据放到这儿。具体位置在哪儿呢?就在应用程序中的App_Data文件夹下,如下图所示:
怎么打开这个文件,看看里面的内容呢?可以通过SSMS中添加数据库进行查看
【注意】直接访问App_Data中的文件会遇到访问访问权限的问题。可参考解决问题的链接
可通过相关的SQL查看数据库中的数据
select * from dbo.aspnet_Membership
select * from dbo.aspnet_Applications
select * from dbo.aspnet_PersonalizationPerUser
select * from dbo.aspnet_Profile
select * from dbo.aspnet_Users
2.4.1 Membership
Membership.CreateUser的源码如参考连接:CreateUser
2.4.1 Membership改进(自定义数据库)
Membership可以连接localDB,能连接其他数据库吗?答案可以的。可以通过相关参数设定,即可连接到其他的数据库中。具体如何进行,可参考自定义数据库
其他的参考连接:自定义数据库文章来源:https://www.toymoban.com/news/detail-433922.html
3 参考连接
1、使用Membership创建用户管理
2、自定义数据库
3、基于表单的身份验证【推荐】
4、ReturnURL中返回到其他站点的时候文章来源地址https://www.toymoban.com/news/detail-433922.html
到了这里,关于asp.net mvc实现系统登录及验证功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!