分享

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

 风声之家 2021-03-23

WEB前端开发社区 昨天

使用Visual Studio的2015年开发ASP.NET的Web API2专案时,有好几种专案范本可以选择,你可以从「空白」专案范本开始,也可以从「MVC」专案范本开始(记得勾选网页API核心参考),也可以直接从「网页API」专案范本开始,由于专案范本通常夹杂大量的范例程式,很多时候我们并无法在第一时间得知每段程式码与设定档的细节,以至于在后续开发的过程发生许多问题。

本篇文章将带大家了解如何成功在ASP.NET的Web API2专案正确启用ASP.NET的表单验证机制(FormsAuthenticaion)。

这边我写了一个非常简单的表单验证程式码,程式码如下:

先建立一个 LoginViewModel

using System.ComponentModel.DataAnnotations;

namespace YourNamespace.Models
{
    public class UserLoginViewModel
    {
        [Required]
        [StringLength(20)]
        public string Username { get; set; }
        [Required]
        public string Password { get; set; }
    }
}

再建立一个 UsersController

using 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)功能进行基本授权验证,因此这是一份完成的表单验证实作,非常容易上手。

以下我将介绍在不同的专案范本下,才能让这段程式码正常运作:

  1. 使用「空白」专案范本开始,外加网络API核心参考(如下图示):

这部分只要在专案根目录下的Web.config中加入<身份验证模式=“表格”> </认证>即可:

2.使用「MVC」专案范本开始,外加网络API核心参考(如下图示):

图片

在MVC专案范本下,预设会停用所有表单验证功能,如果要启用表单验证的话,则要修改的Web.config两个地方:

  1. 调整<认证>的模式属性为形式(原本预设值为无)

  2. 删除<删除名称=“FormsAuthentication”/>设定(原本这行会停用所有表单验证的功能)

图片

由于ASP.NET MVC专案预设移除了FormsAuthentication模组,如果你没有意识到这个模组预设被移除的话,会导致你的代码怎样写都能执行,登入也能跑,也不会发生例外,但登入者会永远是「尚未登入」的鬼打墙状态!

3.使用「网页API」专案范本开始,外加网络API核心参考(如下图示):

在网页API专案范本下,预设也会停用所有表单验证功能,但要改的地方又比MVC专案多一些,地雷实在很多啊!

如果要启用表单验证的话,除了要修改的Web.config两个地方(跟MVC专案范本一样),还要修改App_Start\ WebApiConfig.cs档案:

修改的Web.config两个地方:

  1. 调整<认证>的模式属性为形式(原本预设值为无)

  2. 删除<删除名称=“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,...)即可查看每一个版本的变化历程。

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多