如何在ASP.NET的Web API2专案中启用表单验证(Forms Authentication)

WEB前端开发社区 昨天使用Visual Studio的2015年开发ASP.NET的Web API2专案时,有好几种专案范本可以选择,你可以从「空白」专案范本开始,也可以从「MVC」专案范本开始(记得勾选网页API核心参考),也可以直接从「网页API」专案范本开始,由于专案范本通常夹杂大量的范例程式,很多时候我们并无法在第一时间得知每段程式码与设定档的细节,以至于在后续开发的过程发生许多问题。本篇文章将带大家了解如何成功在ASP.NET的Web API2专案正确启用ASP.NET的表单验证机制(FormsAuthenticaion)。这边我写了一个非常简单的表单验证程式码,程式码如下:先建立一个 LoginViewModelusing System.ComponentModel.DataAnnotations;namespace YourNamespace.Models{public class UserLoginViewModel{[Required][StringLength(20)]public string Username { get; set; }[Required]public string Password { get; set; }}}再建立一个 UsersControllerusing YourNamespace.Models;using System.Net;using System.Web.Http;using System.Web.Security;namespace YourNamespace.Controllers{[RoutePrefix("user")]public class UsersController : ApiController{[Route("login")]public IHttpActionResult PostLogin(UserLoginViewModel user){if (!ModelState.IsValid){return BadRequest();}if (user.Username == "admin" && user.Password == "123"){FormsAuthentication.RedirectFromLoginPage(user.Username, false);return StatusCode(HttpStatusCode.NoContent);}else{return StatusCode(HttpStatusCode.Unauthorized);}}[Route("logout")][HttpGet][HttpPost]public void Logout(){FormsAuthentication.SignOut();}[Authorize][Route("profile")]public IHttpActionResult GetProfile(){return Ok(User.Identity.Name);}}}基本上,上述这两个档案就可以完成最基本的登入(PostLogin),登出(注销)等基本身分验证功能,搭配[授权]动作过滤器(过滤行动)还可以对取得登入者名称(GetProfile)功能进行基本授权验证,因此这是一份完成的表单验证实作,非常容易上手。以下我将介绍在不同的专案范本下,才能让这段程式码正常运作:使用「空白」专案范本开始,外加网络API核心参考(如下图示):这部分只要在专案根目录下的Web.config中加入<身份验证模式=“表格”> </认证>即可:2.使用「MVC」专案范本开始,外加网络API核心参考(如下图示):

在MVC专案范本下,预设会停用所有表单验证功能,如果要启用表单验证的话,则要修改的Web.config两个地方:调整<认证>的模式属性为形式(原本预设值为无)删除<删除名称=“FormsAuthentication”/>设定(原本这行会停用所有表单验证的功能)

由于ASP.NET MVC专案预设移除了FormsAuthentication模组,如果你没有意识到这个模组预设被移除的话,会导致你的代码怎样写都能执行,登入也能跑,也不会发生例外,但登入者会永远是「尚未登入」的鬼打墙状态!3.使用「网页API」专案范本开始,外加网络API核心参考(如下图示):在网页API专案范本下,预设也会停用所有表单验证功能,但要改的地方又比MVC专案多一些,地雷实在很多啊!如果要启用表单验证的话,除了要修改的Web.config两个地方(跟MVC专案范本一样),还要修改App_Start\ WebApiConfig.cs档案:修改的Web.config两个地方:调整<认证>的模式属性为形式(原本预设值为无)删除<删除名称=“FormsAuthentication”/>设定(原本这行会停用所有表单验证的功能)

修改App_Start\ WebApiConfig.cs两行程式码,将其注解起来// config.SuppressDefaultHostAuthentication();// config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

预设的ASP.NET的Web API2专案范本中,由于被设定成仅使用承载权杖验证,因此这两行必须注解起来,表单验证才能正常执行。不过有一点要注意,如果你将这两行注解起来的话,的ASP.NET Web API就不能走专案范本预设的的OAuth验证,专案内的的AccountController也将无法正常使用!本文所有程式码,包含所有修改程式码的版本纪录,都已经整理到 GitHub上了哦,大家可以点击“阅读原文”下载,再透过Git的工具(TortoiseGit,SourceTree,...)即可查看每一个版本的变化历程。声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。喜欢此内容的人还喜欢魔性,用 Python 实现火爆全网的「蚂蚁呀嘿」视频特效!魔性,用 Python 实现火爆全网的「蚂蚁呀嘿」视频特效!...AI悦创不喜欢确定REST API是个啥?REST API是个啥?...码农与软件时代不喜欢确定平兄:第一次见面,还没开始学Java,就想包养我?平兄:第一次见面,还没开始学Java,就想包养我?...平兄聊Java不喜欢确定

(0)

相关推荐

  • HTML5 新特性

    HTML5 的一些最有趣的新特性:1,新的语义元素,比如 <header>, <footer>, <article>, and <section>.2, ...

  • ML.NET 示例:对象检测-ASP.NET Core Web和WPF桌面示例

    dotNET跨平台 今天以下文章来源于My IO ,作者My IO My IO记录工作和生活,将输入变成输出ML.NET 版本API 类型状态应用程序类型数据类型场景机器学习任务算法v1.5.0动态A ...

  • 如何在 ASP.Net Core 中使用 HTTP.sys WebServer ?

    dotNET跨平台 今天 以下文章来源于码农读书 ,作者码农读书 ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,大家都知道 Kestrel 是 A ...

  • 如何在 ASP.NET Core 中使用 HttpClientFactory ?

    dotNET跨平台 今天 以下文章来源于码农读书 ,作者码农读书 ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP ...

  • 如何在 ASP.NET Core 中写出更干净的 Controller

    你可以遵循一些最佳实践来写出更干净的 Controller,一般我们称这种方法写出来的 Controller 为瘦Controller,瘦 Controller 的好处在于拥有更少的代码,更加单一的职 ...

  • 4.创建ASP.NET Core Web应用程序

    这篇文章中,我将教大家如何从头到尾创建ASP.NET Core Web应用程序,这个系列,前面我已经写了三篇文章,大家看这篇文章之前,可以先去熟悉一下前面的3篇文章,打一下基础.在这篇文章中,我将和大 ...

  • ASP.NET Web API 2 中的属性路由

    WEB前端开发社区 昨天路由是 Web API 将 URI 与操作匹配的方式. Web API 2 支持一种称为属性路由的新型路由. 顾名思义,属性路由使用属性来定义路由. 属性路由使您能够对 Web ...

  • 针对ASP.NET Core Web API的先进架构

    WEB前端开发社区 昨天.NET Core 最初是在2016年发布的,随着.NET Core 2.0的发布,微软拥有了下一个通用.模块化.跨平台和开源的平台主版本..NET Core已经创建了许多AP ...

  • 如何在 asp.net core 3.x 的 startup.cs 文件中获取注入的服务

    一.前言 从 18 年开始接触 .NET Core 开始,在私底下.工作中也开始慢慢从传统的 mvc 前后端一把梭,开始转向 web api + vue,之前自己有个半成品的 asp.net core ...

  • 如何在 ASP.Net Core 中使用 Serilog

    记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志框架,但如果你的 日志文件 包含非结构化的数据,那么查询起来将是一个噩梦,所以需要在记录日志的时候采用结构化方式. 将 ...