打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)

一、Forms认证

1、在webapi项目中启用Forms认证

Why:为什么要在WebAPI中使用Forms认证?因为其它项目使用的是Forms认证。

What:什么是Forms认证?它在WebAPI中就是一个MessageHandle,具体请查找关键字“ASP.NET Forms

How:如何启动Forms认证?

  最简单的是通过配置启动Forms认证:

1 <system.web>2     <authentication mode="Forms">3       <forms name=".FormsCookie" loginUrl="/login.aspx" protection="All" timeout="43200" path="/" defaultUrl="http://www.cnblogs.com" domain=".cnblogs.com" cookieless="UseCookies" />4     </authentication>5     <httpCookies httpOnlyCookies="true" />6   </system.web>7   <system.webServer>

  简单说说Forms认证的工作原理:首先在管道中,Forms读取请求中的相关的cookie,解密,进行认证,并把认证的结果写到请求上下文和线程的Identity属性中。然后请求继续往后面走,最终生成的响应在管道中返回时,Forms会判断如果响应为401,那么就location到配置中的loginUrl设置的地址,并改变status为302。

2、几个Attribute

Why:为什么要认识Attribute?因为Forms认证的结果是写到Identity属性中,一般我们要获取该属性,判断是否认证成功,如果失败返回401,等等进行很多处理。是不是很麻烦?对,封装起来,自己写一个吗?当然可以,其实微软大法早就考虑好了,针对一般的场景的处理逻辑都封装好了,他们分别叫做

AuthorizeAttribute、AllowAnonymousAttribute,都是Attribute。

What:这些Attribute是什么?顾名思义,AuthorizeAttribute只允许认证通过的请求,AllowAnonymousAttribute允许匿名请求。

How:那么该怎么用呢?很简单他们可以作用类型、方法上,所以可以全局注册、controller、action, so easy!

 

3、重写unauthorize中验证失败方法

Why:因为如果response status == 401,那么Forms会location到配置中的loginUrl,(即使没有手动配置它,也会生成一个默认值“login.aspx”),并且设置status为302。如果客户端是浏览器的话,那么就会直接进行跳转而无法捕获这个状态,这在很多场景下不合适,例如:spa(单页应用)中,我们不希望它自动跳转到登陆页面,而是给出提示,让用户自己选择是否登录。所以要重写Forms中身份验证失败的处理逻辑。

How:在AuthorizationFilterAttribute中有个虚方法HandleUnauthorizedRequest,重写它来实现自定义的处理逻辑。这样的设计思路挺不错,可以多借鉴。

    /// <summary>    /// If unauthorize return 403 instead of  401, avoid redirect.    /// </summary>    public class ForbiddenLocationAuthorizeAttribute : AuthorizeAttribute    {        protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)        {            HttpResponseMessage response = new HttpResponseMessage();            response.StatusCode = System.Net.HttpStatusCode.Forbidden;            actionContext.Response = response;        }    }

使用403(Forbidden)来代替401,这样就可以避免Forms的自动跳转了。虽然这样做有些弊端,但这也不失为一个有效的解决办法。

二、ModelValidata(模型验证)

1、Why

  凡是有用户输入的地方都少不了参数验证,这不光是个安全问题,也是为了保证数据完整正确。

2、What

  WebAPI集成了模型验证机制,当请求被action执行之前,有一个模型绑定的步骤,它就是匹配action的参数,具体细节就不说了,ModelValidata就是在这里进行,它会根据Model中各个属性的DataAnnotations(数据注解)来进行验证,最终把结果保存在action的上下文的一个属性中,即actionContext.ModelState.IsValid。

3、How

  a、为Model设置DataAnnotations

  

public class BannerDto    {        [JsonProperty(PropertyName = "id")]        [Required(ErrorMessage = "Id是必须的")]        public Guid Id { get; set; }        [JsonProperty(PropertyName = "title")]        [Required(ErrorMessage = "标题不能为空")]        [MaxLength(200, ErrorMessage = "标题不能超过200个字符")]        public string Title { get; set; }        [JsonProperty(PropertyName = "src")]        [Required(ErrorMessage = "图片链接不能为空")]        [MaxLength(500, ErrorMessage = "图片链接不能超过500个字符")]        public string ImageUri { get; set; }        [JsonProperty(PropertyName = "href")]        [Required(ErrorMessage = "超链接不能为空")]        [MaxLength(500, ErrorMessage = "超链接不能超过500个字符")]        public string Href { get; set; }        [JsonIgnore]        public Guid? AuthorityId { get; set; }        [JsonIgnore]        public bool IsDeleted { get; set; } = false;        [JsonProperty(PropertyName ="createDate")]        public DateTime CreateDate { get; set; }    }

  ps:[JsonProperty]、[JsonIgnore]是指定Json序列化的一些相关设置,设置别名、忽略等等。返回优雅的变量的名称,保证代码风格。

  DataAnnotations的使用,请查看msdn,太简单了。设置好约束条件和ErrorMessage,当验证失败了,就会返回ErrorMessage。

  b、使用Filter方式,为Action添加验证,好处就不多说了。

public class ValidataModelAttribute : ActionFilterAttribute    {        public override void OnActionExecuting(HttpActionContext actionContext)        {            if (!actionContext.ModelState.IsValid)            {                actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);            }        }    }

别忘了在HttpComfiguration中注入这个Filter

            //模型验证            config.Filters.Add(new ValidataModelAttribute());    

对于不希望不验证的Action可以使用OverrideActionFilters重写上级设置的所有Fiters。

ModelValidate失败的请求会得到400的响应,同时所有ErrorMessage都会在响应报文中,例如:

{"Message":"The request is invalid.","ModelState":{"sub.Href":["超链接不可为空"]}}

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
WebAPI基础知识学习(上)
C# webApi
ASP.NET Core 2.2 WebApi 系列【八】统一返回格式(返回值、模型验证、异常)
ASP.Net Core 3.1 中使用JWT认证
WebAPI 基本身份验证授权筛选器
dotNET Core WebAPI 统一处理(返回值、参数验证、异常)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服