一、Forms认证

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

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

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

How:如何启动Forms认证?

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

 <system.web>
<authentication mode="Forms">
<forms name=".FormsCookie" loginUrl="/login.aspx" protection="All" timeout="43200" path="/" defaultUrl="http://www.cnblogs.com" domain=".cnblogs.com" cookieless="UseCookies" />
</authentication>
<httpCookies httpOnlyCookies="true" />
</system.web>
<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(, ErrorMessage = "标题不能超过200个字符")]
public string Title { get; set; } [JsonProperty(PropertyName = "src")]
[Required(ErrorMessage = "图片链接不能为空")]
[MaxLength(, ErrorMessage = "图片链接不能超过500个字符")]
public string ImageUri { get; set; } [JsonProperty(PropertyName = "href")]
[Required(ErrorMessage = "超链接不能为空")]
[MaxLength(, 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":["超链接不可为空"]}}

在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)的更多相关文章

  1. 关于ASP.NET WebAPI中HTTP模型的相关思考

    对于.NET的分布式应用开发,可以供我们选择的技术和框架比较多,例如webservice,.net remoting,MSMQ,WCF等等技术.对于这些技术很多人都不会陌生,即时没有深入的了解,但是肯 ...

  2. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  3. [转]ASP.NET Core 中的那些认证中间件及一些重要知识点

    本文转自:http://www.qingruanit.net/c_all/article_6645.html 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系 ...

  4. ASP.NET Core 中jwt授权认证的流程原理

    目录 1,快速实现授权验证 1.1 添加 JWT 服务配置 1.2 颁发 Token 1.3 添加 API访问 2,探究授权认证中间件 2.1 实现 Token 解析 2.2 实现校验认证 1,快速实 ...

  5. 在ASP.NET WebAPI 中使用缓存【Redis】

    初步看了下CacheCow与OutputCache,感觉还是CacheOutput比较符合自己的要求,使用也很简单 PM>Install-Package Strathweb.CacheOutpu ...

  6. Using ASP.Net WebAPI with Web Forms

    Asp.Net WebAPI is a framework for building RESTful HTTP services which can be used across a wide ran ...

  7. Asp.Net WebAPI 中Cookie 获取操作方式

    1. /// <summary> /// 获取上下文中的cookie /// </summary> /// <returns></returns> [H ...

  8. 如何简单的在 ASP.NET Core 中集成 JWT 认证?

    前情提要:ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统 文章超长预警(1万字以上),不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包 自上一 ...

  9. [翻译] ASP.NET WebAPI 中的异常处理

    原文链接:https://docs.microsoft.com/en-us/aspnet/web-api/overview/error-handling/exception-handling 本文介绍 ...

随机推荐

  1. MVC中使用EF:排序,过滤,分页

    原文链接:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/sorting-filtering-and-paging ...

  2. [转载]赖勇浩:推荐《Linux 多线程服务器端编程》

    推荐<Linux 多线程服务器端编程> 赖勇浩(http://laiyonghao.com) 最近,有一位朋友因为工作需要,需要从网游的客户端编程转向服务器端编程,找我推荐一本书.我推荐了 ...

  3. new 一个button 然后dispose,最后这个button是null吗???

    结果当然不是,button虽然释放了资源,但是它扔指向原来的那个地址,故不等于null 可以用button.isdispose==true判断

  4. 【转载】java项目中经常碰到的内存溢出问题: java.lang.OutOfMemoryError: PermGen space, 堆内存和非堆内存,写的很好,理解很方便

    Tomcat Xms Xmx PermSize MaxPermSize 区别 及 java.lang.OutOfMemoryError: PermGen space 解决 解决方案 在 catalin ...

  5. javascript学习第五课this、call、apply

    js函数与其它 高级语言相比有一个特点.没有返回值,一个简单函数就是function关键字+函数名字构成 this 对象是在运行中基于函数的执行环境绑定的,在全局函数中,this等于window,而当 ...

  6. 安装完ODAC,出现ORA-12560:TNS:协议适配器错误 12541 无监听程序的解决

    进入系统环境变量设置,查看Path路径,发现D:\oracle\product\11.2.0\client_1等路径放到了oracle11g数据库路径前面,将新加入的路径置后即可解决ORA-12560 ...

  7. HttpWebRequest类

    HttpWebRequest类与HttpRequest类的区别. HttpRequest类的对象用于服务器端,获取客户端传来的请求的信息,包括HTTP报文传送过来的所有信息.而HttpWebReque ...

  8. css3中的字体样式

    text-overform:ellipsis省略号/clip裁剪. overform:hidden溢出隐藏文字. 但是text-overflow只是用来说明文字溢出时用什么方式显示,要实现溢出时产生省 ...

  9. js如何判断手机机型

    <script language="javascript"> window.onload = function () { alert("1"); v ...

  10. Tomcat如何配置环境变量

    1, JDK:版本为jdk-7-windows-i586.exe 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index ...