如何使用 Web API 来对 MVC 应用程序进行身份验证

如何使用 Web API 来对 MVC 应用程序进行身份验证,第1张

如何使用web api 保证数据的有效性?实际项目中不是什么数据提交过来都是符合要求的,况且在天朝还有N多河蟹的关键字等等。所以以下内容就是增加web api 数据验证.

第一步修改 实体模型

复制代码

public class UserInfo

{

public int Id { getset}

[Required]

[StringLength(20,ErrorMessage="名字太长了或者太短了",MinimumLength=4)]

public string Name { getset}

[RegularExpression(@"([2-5]\d)",ErrorMessage="年龄在20-50之间")]

public int Age { getset}

}

复制代码

注意:需要添加 System.ComponentModel.DataAnnotations引用

第二步增加Filter

复制代码

public class ValidationAttribute : ActionFilterAttribute

{

public override void OnActionExecuting(HttpActionContext actionContext)

{

if (!actionContext.ModelState.IsValid)

{

actionContext.Response = actionContext.Request.CreateErrorResponse(

HttpStatusCode.BadRequest,

actionContext.ModelState)

}

}

}

复制代码

注意:需要引入命名空间

复制代码

using System.Web

using System.Web.Http.Filters

using System.Web.Http.ModelBinding

using System.Web.Http.Controllers

using System.Net.Http

using System.Net

using Newtonsoft.Json.Linq

复制代码

第三步 注册Filter

打开 webApiConfig

添加代码

config.Filters.Add(new Filters.ValidationAttribute())

第四步 编写页面

引入js/CSS

<link href="Content/Site.css" rel="stylesheet" type="text/css" />

<script src="Scripts/jquery-1.7.1.min.js" type="text/javascript"></script>

<script src="Scripts/knockout-2.1.0.js" type="text/javascript"></script>

<script src="Scripts/jquery.validate.min.js" type="text/javascript"></script>

<script src="Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>

拷贝HTMLPage2的内容稍作修改

复制代码

<label for="text">

名称</label>

<input id="name" name="name" data-val="true" data-val-required="是不是忘记输入名称了?" type="text"

value="" />

<span class="field-validation-valid" data-valmsg-for="name" data-valmsg-replace="true">

</span>

<label for="text">

年龄</label>

<input id="age" name="age" type="text" data-val="true" data-val-required="年龄也是必须输入的哦!"

value="" />

<span class="field-validation-valid" data-valmsg-for="age" data-valmsg-replace="true">

</span>

<br />

<button type="submit">

Submit</button>

复制代码

增加js,这段js是将服务返回的错误消息进行显示

复制代码

$.validator.addMethod("failure", function () { return false})

$.validator.unobtrusive.adapters.addBool("failure")

$.validator.unobtrusive.revalidate = function (form, validationResult) {

$.removeData(form[0], 'validator')

var serverValidationErrors = []

for (var property in validationResult) {

var elementId = property.toLowerCase()

elementId = elementId.substr(elementId.indexOf('.') + 1)

var item = form.find('#' + elementId)

serverValidationErrors.push(item)

item.attr('data-val-failure', validationResult[property][0])

jQuery.validator.unobtrusive.parseElement(item[0])

}

form.valid()

$.removeData(form[0], 'validator')

$.each(serverValidathttp://www.yingtaow.com/sitemap.xml?ionErrors, function () {

this.removeAttr('data-val-failure')

jQuery.validator.unobtrusive.parseElement(this[0])

})

}

复制代码

增加服务器返回错误消息显示 *** 作

400 /* BadRequest */: function (jqxhr) {

var validationResult = $.parseJSON(jqxhr.responseText)

$.validator.unobtrusive.revalidate(form, validationResult.ModelState)

}

浏览测试得到效果

1 没有任何输入

2 输入不合法

本篇完整代码:/Files/risk/web api 5/MvcApplication1.rar

public class RegisterController : ApiController

02

{private ApplicationUserManager UserManager

03

{get

04

{return Request.GetOwinContext().GetUserManager<ApplicationUserManager>()

05

}

06

}public IHttpActionResult Post(RegisterApiModel model)

07

{if (!ModelState.IsValid)

08

{return BadRequest(ModelState)

09

}var user = new ApplicationUser

10

{

11

Email = model.Email,

12

UserName = model.Email,

13

EmailConfirmed = true

14

}

15

var result = UserManager.Create(user, model.Password)

16

return result.Succeeded ? Ok() : GetErrorResult(result)

17

}

18

private IHttpActionResult GetErrorResult(IdentityResult result)

19

{

20

if (result == null)

21

{

22

return InternalServerError()

23

}

24

if (result.Errors != null)

25

{

26

foreach (var error in result.Errors)

27

{

28

ModelState.AddModelError("", error)

29

}

30

}

31

if (ModelState.IsValid)

32

{

33

// No ModelState errors are available to send, so just return an empty BadRequest.

34

return BadRequest()

35

}

36

return BadRequest(ModelState)

37

}

38

}

首先,mvc开发的是web应用,web应用中, 一般使用cookie或者session来进行身份验证。

参考:http://my.oschina.net/xianggao/blog/395675 介绍了cookie和session的概念和作用,

简单的说,Cookie是客户端记录的信息, Session是服务器记录的信息,  而身份验证需要使用的就是Cookie或者Session。

所以,mvc做身份验证(登录),第一步是验证身份,然后颁发给用户cookie或者session,

如:

//控制器代码:

[HttpPost]

public ActionResult Login() 

{

     //...登录验证, 

     if(用户名密码正确)

     {

         Session["UserId"] = "100" //这里举的是最简单的例子,即记录用户的ID

     }

}

那么记录了之后, 服务器就知道,这个人是ID = “100"的那个用户了,然后就是验证了。

在MVC中,一般使用FIlter来控制用户的权限,即某个Action需要怎么样的权限、或者指定某个用户才能进行访问,否则返回一个错误。

一般会重写过滤器, 在你的MVC项目中新建一个类:

public class MyAuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute

//继承mvc自带的AuthorizeAttribute

    {

        protected override bool AuthorizeCore(HttpContextBase httpContext)

        {

           if(httpContext.Session["UserId"]!=null)

           {

               if(httpContext.Session["UserId"]=="100"}

               {

                   return true

                }

                else

                {

                    return false

                }

           }

            return false

        }

    }

这个过滤器很简单, 如果Session["UserId"] =="100"的时候,才会通过(返回true),其他都不允许通过。

最后一步,就是给需要验证身份的控制器加上这个过滤器即可。

[Authorize] 

//这个就是验证身份的, 如果用户没有登录,或者UserId不等于100,

系统会禁止他进入Index的界面

public ActionResult Index()

{

     Return View()

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11426073.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存