前几天Insus.NET有在数据库实现过对某一字段进行加密码与解密《使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和解密http://www.cnblogs.com/insus/p/5983645.html那今次Insus.NET在ASP.NET MVC实现自定义验证Authorize Attribute。

实现之前,Insus.NET对usp_Users_VeryLoginVerify修改一下,改为更好理解与使用:

  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5. ALTER PROCEDURE [dbo].[usp_Users_VeryLoginVerify]
  6. (
  7. @U_nbr NVARCHAR(20),
  8. @pwd NVARCHAR(100)
  9. )
  10. AS
  11. BEGIN
  12. DECLARE @errmsg NVARCHAR(50) = N'用户名或密码错误。'
  13.  
  14. IF NOT EXISTS(SELECT TOP 1 1 FROM [dbo].[Users] WHERE [U_nbr] = @U_nbr)
  15. BEGIN
  16. RAISERROR(@errmsg,16,1)
  17. RETURN
  18. END
  19.  
  20. SELECT [U_nbr] AS [Account] FROM [dbo].[Users] WHERE [U_nbr] = @U_nbr AND CONVERT(NVARCHAR(100),DECRYPTBYPASSPHRASE('insus#sec!%y',[Pwd])) = @pwd
  21.  
  22. IF @@ROWCOUNT <= 0
  23. BEGIN
  24. RAISERROR(@errmsg,16,1)
  25. RETURN
  26. END
  27. END

Source Code

OK,上面是数据库方面。
接下你需要在ASP.NET MVC写程序:

使用Cookie来存储登录以及验证信息,写一个Cookie类别:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. namespace Insus.NET.Utilities
  7. {
  8. public abstract class CookieBase
  9. {
  10. private static HttpResponse Response
  11. {
  12. get
  13. {
  14. return HttpContext.Current.Response;
  15. }
  16. }
  17.  
  18. private static HttpRequest Request
  19. {
  20. get
  21. {
  22. return HttpContext.Current.Request;
  23. }
  24. }
  25.  
  26. public static HttpCookie Cookie
  27. {
  28. get
  29. {
  30. return Request.Cookies["CookieBase"] as HttpCookie;
  31. }
  32. set
  33. {
  34. if (Request.Cookies["CookieBase"] != null)
  35. {
  36. Request.Cookies.Remove("CookieBase");
  37. }
  38. Response.Cookies.Add(value);
  39. }
  40. }
  41.  
  42. public static HttpCookie NewCookie
  43. {
  44. get
  45. {
  46. return new HttpCookie("CookieBase");
  47. }
  48. }
  49.  
  50. public static void RemoveCookie()
  51. {
  52. if (Cookie == null)
  53. Response.Cookies.Remove("CookieBase");
  54. else
  55. Response.Cookies["CookieBase"].Expires = DateTime.Now.AddDays(-1);
  56. }
  57. }
  58. }

Source Code

其实上面这个CookeBase.cs是一个能存储多对象的集合类。在真正的程序中,你想存储什么信息,可以写一个如下面的类来操作:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Web;
  7.  
  8. namespace Insus.NET.Utilities
  9. {
  10. public class SecurityBase
  11. {
  12. public static bool IsAuthorized
  13. {
  14. get
  15. {
  16. return CookieBase.Cookie == null ? false : bool.Parse(CookieBase.Cookie.Values["IsAuthorized"]);
  17. }
  18. set
  19. {
  20. HttpCookie httpCookie = CookieBase.Cookie == null ? CookieBase.NewCookie : CookieBase.Cookie;
  21. httpCookie.Values["IsAuthorized"] = value.ToString();
  22. CookieBase.Cookie = httpCookie;
  23. }
  24. }
  25.  
  26. public static string UserName
  27. {
  28. get
  29. {
  30. return CookieBase.Cookie == null ? string.Empty : CookieBase.Cookie.Values["UserName"];
  31. }
  32. set
  33. {
  34. HttpCookie httpCookie = CookieBase.Cookie == null ? CookieBase.NewCookie : CookieBase.Cookie;
  35. httpCookie.Values["UserName"] = value;
  36. CookieBase.Cookie = httpCookie;
  37. }
  38. }
  39.  
  40. public static void RemoveCooke()
  41. {
  42. CookieBase.RemoveCookie();
  43. }
  44. }
  45. }

Source Code

接下来,我们需要创建一个验证过滤器:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Web;
  7. using System.Web.Mvc;
  8. using Insus.NET.Utilities;
  9. using System.Web.Routing;
  10.  
  11. namespace Insus.NET.Attributes
  12. {
  13. public class SecurityAuthorizeAttribute : AuthorizeAttribute
  14. {
  15. protected override bool AuthorizeCore(HttpContextBase httpContext)
  16. {
  17. return SecurityBase.IsAuthorized;
  18. }
  19.  
  20. public override void OnAuthorization(AuthorizationContext filterContext)
  21. {
  22. string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
  23. string actionName = filterContext.ActionDescriptor.ActionName;
  24. base.OnAuthorization(filterContext);
  25. }
  26.  
  27. protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
  28. {
  29. var routeValue = new RouteValueDictionary {
  30. { "Controller", "Home"},
  31. { "Action", "Index"}
  32. };
  33. filterContext.Result = new RedirectToRouteResult(routeValue);
  34. }
  35. }
  36. }

Source Code

这个过滤器SecurityAuthorizeAttribute.cs,稍后我们会在控制器中应用到它。

接下你需要写控制器了,不,我们似乎少写了一些物件,如model和Entity:

Models写好,还差一个Entity,这个实体是与数据连接的物件:

在ASP.NET MVC中,实现登录验证的演示,最少需要两个控制器,一个是给匿名用户访问的,它包含普通的页面和一些基本的操作。另一个控制器是经过验证通过之后才能访问的页面。

另一个控制器:

最后是创建视图了:

  1. @{
  2. Layout = null;
  3. }
  4.  
  5. <!DOCTYPE html>
  6.  
  7. <html>
  8. <head>
  9. <meta name="viewport" content="width=device-width" />
  10. <title>Index</title>
  11.  
  12. <style type="text/css">
  13. #logincontact label {
  14. display: inline-block;
  15. width: 100px;
  16. text-align: right;
  17. }
  18.  
  19. #logincontact_submit {
  20. padding-left: 100px;
  21. }
  22.  
  23. #logincontact div {
  24. margin-top: 1em;
  25. }
  26.  
  27. .error {
  28. display: none;
  29. margin-left: 10px;
  30. }
  31.  
  32. .error_show {
  33. color: red;
  34. margin-left: 10px;
  35. }
  36.  
  37. input.invalid {
  38. border: 2px solid red;
  39. }
  40.  
  41. input.valid {
  42. border: 2px solid green;
  43. }
  44. </style>
  45.  
  46. <script src="~/Scripts/jquery-2.2.1.js"></script>
  47.  
  48. <script type="text/javascript">
  49. ////<![CDATA[
  50. $(document).ready(function () {
  51. $('#logincontact_Account').on('input', function () {
  52. var input = $(this);
  53. var is_Account = input.val();
  54. if (is_Account) {
  55. input.removeClass("invalid").addClass("valid");
  56. }
  57. else {
  58. input.removeClass("valid").addClass("invalid");
  59. }
  60. });
  61.  
  62. $('#logincontact_Password').on('input', function () {
  63. var input = $(this);
  64. var is_Password = input.val();
  65. if (is_Password) {
  66. input.removeClass("invalid").addClass("valid");
  67. }
  68. else {
  69. input.removeClass("valid").addClass("invalid");
  70. }
  71. });
  72.  
  73. $('#ButtonSignIn').click(function (event) {
  74. var form_data = $("#logincontact").serializeArray();
  75. var error_free = true;
  76. for (var input in form_data) {
  77. var element = $("#logincontact_" + form_data[input]['name']);
  78. var valid = element.hasClass("valid");
  79. var error_element = $("span", element.parent());
  80.  
  81. if (!valid) {
  82. error_element.removeClass("error").addClass("error_show");
  83. error_free = false;
  84. }
  85. else {
  86. error_element.removeClass("error_show").addClass("error");
  87. }
  88. }
  89.  
  90. if (!error_free) {
  91. event.preventDefault();
  92. }
  93. else {
  94. var obj = {};
  95. obj.Account = $('#logincontact_Account').val(),
  96. obj.Password = $('#logincontact_Password').val()
  97.  
  98. $.ajax({
  99. type: 'POST',
  100. url: '/Home/LoginVerify',
  101. dataType: 'json',
  102. data: JSON.stringify(obj),
  103. contentType: 'application/json; charset=utf-8',
  104. success: function (data, textStatus) {
  105. alert("登录成功。");
  106. window.location.href = "/User/Index";
  107. },
  108. error: function (XMLHttpRequest, textStatus, errorThrown) {
  109. alert(errorThrown);
  110. },
  111. });
  112. }
  113. });
  114. });
  115. //]]>
  116. </script>
  117. </head>
  118. <body>
  119. <form id="logincontact" method="post" action="">
  120. <div>
  121. <label for="logincontact_Account">Account:</label>
  122. <input type="text" id="logincontact_Account" name="Account" />
  123. <span class="error">This account field is required.</span>
  124. </div>
  125. <div>
  126. <label for="logincontact_Password">Password:</label>
  127. <input type="password" id="logincontact_Password" name="Password" />
  128. <span class="error">This password field is required.</span>
  129. </div>
  130. <div id="logincontact_submit">
  131. <input id="ButtonSignIn" type="button" value="Sign In" />
  132. </div>
  133. </form>
  134. </body>
  135. </html>

Source Code

还有一个:

  1. @{
  2. Layout = null;
  3. }
  4.  
  5. <!DOCTYPE html>
  6. <html>
  7. <head>
  8. <meta name="viewport" content="width=device-width" />
  9. <title>Index</title>
  10. <script src="~/Scripts/jquery-2.2.1.js"></script>
  11.  
  12. <script type="text/javascript">
  13. ////<![CDATA[
  14. $(document).ready(function () {
  15.  
  16. $('#ButtonSignOut').click(function (event) {
  17. $.ajax({
  18. type: 'POST',
  19. url: '/Home/SignOut',
  20. contentType: 'application/json; charset=utf-8',
  21. success: function (data, textStatus) {
  22. alert("已经安全退出网站。");
  23. window.location.href = "/Home/Index";
  24. },
  25. error: function (XMLHttpRequest, textStatus, errorThrown) {
  26. alert(errorThrown);
  27. },
  28. });
  29. });
  30. });
  31. //]]>
  32. </script>
  33. </head>
  34. <body>
  35. <div>
  36. Hi @ViewBag.UserName
  37. <br />
  38. <input id="ButtonSignOut" type="button" value="Sign Out" />
  39. </div>
  40. </body>
  41. </html>

Source Code

结束了,来一个实时演示吧:

ASP.NET MVC自定义验证Authorize Attribute的更多相关文章

  1. ASP.NET MVC自定义验证Authorize Attribute(包含cookie helper)

    前几天Insus.NET有在数据库实现过对某一字段进行加密码与解密<使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和 ...

  2. ASP.NET MVC Model验证(五)

    ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...

  3. 通过扩展改善ASP.NET MVC的验证机制[实现篇]

    原文:通过扩展改善ASP.NET MVC的验证机制[实现篇] 在<使用篇>中我们谈到扩展的验证编程方式,并且演示了本解决方案的三大特性:消息提供机制的分离.多语言的支持和多验证规则的支持, ...

  4. Asp.Net MVC 身份验证-Forms

    Asp.Net MVC 身份验证-Forms 在MVC中对于需要登录才可以访问的页面,只需要在对应的Controller或Action上添加特性[Authorize]就可以限制非登录用户访问该页面.那 ...

  5. ASP.NET MVC异步验证是如何工作的03,jquery.validate.unobtrusive.js是如何工作的

    在上一篇"ASP.NET MVC异步验证是如何工作的02,异步验证表单元素的创建"中了解了ASP.NET异步验证是如何创建表单元素的,本篇体验jquery.validate.uno ...

  6. ASP.NET MVC Model验证(四)

    ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...

  7. ASP.NET MVC Model验证(三)

    ASP.NET MVC Model验证(三) 前言 上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的M ...

  8. ASP.NET MVC Model验证(二)

    ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...

  9. ASP.NET MVC Model验证(一)

    ASP.NET MVC Model验证(一) 前言 前面对于Model绑定部分作了大概的介绍,从这章开始就进入Model验证部分了,这个实际上是一个系列的Model的绑定往往都是伴随着验证的.也会在后 ...

随机推荐

  1. SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享

    SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享 第一步建库和建表 USE [master] GO CREATE DATABASE [MonitorElapsedHighSQL] G ...

  2. .Net 跨平台可移植类库PCL可用于任何平台包括Mono

    Microsoft 在 .NET Framework 4 中添加了一个名为可移植类库 (PCL) 的新功能. 利用 PCL,您可以有选择性地面向 .NET Framework.Silverlight ...

  3. 可在广域网部署运行的QQ高仿版 -- GGTalk总览

     (最新版本:V5.5,2016.12.06  增加对MySQL数据库的支持.) (android移动端:2015.09.24 最初发布 ,2016.11.25 最后更新) GGTalk(简称GG)是 ...

  4. MySQL 指定各分区路径

    200 ? "200px" : this.width)!important;} --> 介绍 可以针对分区表的每个分区指定各自的存储路径,对于innodb存储引擎的表只能指定 ...

  5. MySQL 存储过程

    MySQL 存储过程 存储过程是通过给定的语法格式编写自定义的数据库API,类似于给数据库编写可执行函数. 简介 存储过程是一组为了完成特定功能的SQL语句集合,是经过编译后存储在数据库中. 存储过程 ...

  6. ASP.NET MVC 路由(一)

    ASP.NET MVC路由(一) 前言 从这一章开始,我们即将进入MVC的世界,在学习MVC的过程中在网上搜索了一下,资料还是蛮多的,只不过对于我这样的初学者来看还是有点难度,自己就想看到有一篇引导性 ...

  7. 微冷的雨Java基础学习手记(一)

    使用Java理解程序逻辑 之凌波微步 船舶停靠在港湾是很安全的,但这不是造船的目的 北大青鸟五道口原玉明老师出品 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识点时,要 ...

  8. ORM小练习代码

    DOG类 namespace RupengORM { public class Dog { public Dog() { } /// <summary> /// 显示提供无参构造函数 // ...

  9. 简单了解JS 中的indexOf方法

    indexOf() 方法返回指定值在字符串对象中首次出现的位置.从 fromIndex 位置开始查找,如果不存在,则返回 -1. 首先先看下MDN下的参考文档,文档里列出的很详细,这里我只列出了注意点 ...

  10. 使用easyui-layout布局

    <body class="easyui-layout"> <div data-options="region:'north',title:'顶部',sp ...