一、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. NDB Cluster 存储引擎物理备份

    NDB Cluster 存储引擎物理备份NDB Cluster 存储引擎也是一款事务性存储引擎,和Innodb 一样也有redo 日志.NDBCluter 存储引擎自己提供了备份功能,可以通过相关的命 ...

  2. C/C++中extern关键字解析

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  3. CentOS系统下安装配置ftp服务

    安装配置步骤: rpm -ivh /opt/bak/vsftpd-2.2.2-11.el6.x86_64.rpm --本地安装vsftpd ll /etc/vsftpd/  --查看vsftpd的配置 ...

  4. 总结30个CSS选择器

    或许大家平时总是在用的选择器都是:#id  .class  以及标签选择器.可是这些还远远不够,为了在开发中更加得心应手,本文总结了30个CSS3选择器,希望对大家有所帮助. 1 *:通用选择器 * ...

  5. A multi-faceted language for the Java platform

    最近在研究关于groovy 相关的技术 希望有研究交到研究这方面的朋友 Groovy 最新的地址 http://www.groovy-lang.org/

  6. 两种状态显示处理. enum , Linq AsEnumerable

    1.ENUM protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { GridViewRow ro ...

  7. Python小练习一

    # 对http://www.something.com形式的URL进行分割 url = input("Please enter the URL:") domain = url[11 ...

  8. 【转】gtk+多线程的程序实例

    #include <gtk/gtk.h> gint test() { while(1) { gdk_threads_enter(); g_printf("hello\n" ...

  9. Sublime Text 用法小记

    复制当前行: Ctrl + Shift + D 上下移动行: Ctrl + Shift + ↑/↓ 选中行部分: Crtl + Shift + ←/→ 格式化json: Ctrl + Alt + J

  10. Springmvc中@RequestParam传值中文乱码解决方案

    首先jsp表单里面有一些参数要传到controller中,通过以下方法接收: @RequestMapping(value="/orderPaper") public ModelAn ...