广告
返回顶部
首页 > 资讯 > 精选 >Web API如何实现Basic基础认证
  • 686
分享到

Web API如何实现Basic基础认证

2023-06-29 12:06:16 686人浏览 独家记忆
摘要

这篇文章主要介绍了WEB api如何实现Basic基础认证的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Web API如何实现Basic基础认证文章都会有所收获,下面我们一起来看看吧。一、w

这篇文章主要介绍了WEB api如何实现Basic基础认证的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Web API如何实现Basic基础认证文章都会有所收获,下面我们一起来看看吧。

一、webapi中为什么需要身份认证

我们在使用WebApi的时候,都是通过URL去获取数据。也就是说,任何人只要知道了URL地址,就能随意的访问后台的服务接口,就可以访问或者修改数据库数据了,这样就会导致很严重的后果。

我们不加身份认证,匿名用户可以直接通过url随意访问接口:

Web API如何实现Basic基础认证

增加了身份认证之后,只有带了票据的请求才能访问对应的接口。

Web API如何实现Basic基础认证

二、常见的认证方式

WebApi中常见的认证方式有如下几种:

  • FORM身份验证

  • 集成windows验证

  • Basic基础认证

  • Digest摘要认证

三、Basic基础认证

Basic基础认证原理

Basic认证的基本原理就是加密用户信息生成Ticket,每次请求后端API接口的时候把生成的Ticket信息加到Http请求的头部传给后端进行验证。具体步骤如下:

  • 登录的时候验证用户名和密码,如果验证通过,则将用户名和密码按照一定的规则生成加密后的票据信息Ticket,然后将Ticket传递到前端

  • 如果登录成功,前端定义一个全局的变量接收API接口返回的Ticket信息。

  • 前端界面再次发起ajax请求后端API接口的时候,将Ticket信息加入到HTTP请求的Head里面,将Ticket信息随着http请求一起发送到后端API接口。

  • 在后端的WebApi服务中定义一个类,该类继承自AuthorizeAttribute类,然后重新父类里面的OnAuthorization方法,在OnAuthorization方法里面,通过actionContext参数取得http请求的Head,从Head里面可以获取前端传递过来的Ticket信息。将Ticket解密得到用户名和密码,然后验证用户名和密码是否正确。如果正确,表示验证通过。如果不正确,则返回401未授权的错误。

四、Basic基础认证示例代码

假设我们要访问Users控制器的Get接口,该接口方法返回int类型的List集合

1、登录的API接口

using Newtonsoft.JSON;using System;using System.Collections.Generic;using System.Linq;using System.net;using System.Net.Http;using System.Web.Http;using System.Web.Security;using WebApiBasicAuthorize.CustomerAttribute;using WebApiBasicAuthorize.Entity;namespace WebApiBasicAuthorize.Controllers{    [BasicAuthorize]    public class UsersController : ApiController    {        /// <summary>        /// 允许匿名登录        /// </summary>        /// <param name="account"></param>        /// <param name="passWord"></param>        /// <returns></returns>        [AllowAnonymous]        [HttpGet]        public IHttpActionResult Login(string account,string password)        {            ReturnValueEntity entity = new ReturnValueEntity();            // 真实生产环境中要去数据库校验account和password            if (account.ToUpper().Trim().Equals("ADMIN") && password.Trim().Equals("123456"))            {                FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(0, account, DateTime.Now,                    DateTime.Now.AddHours(1), true, string.Format("{0}&{1}", account, password),                    FormsAuthentication.FormsCookiePath);                var result = new { Result = true, Ticket = FormsAuthentication.Encrypt(ticket) };                entity.Result = true;                entity.Ticket = FormsAuthentication.Encrypt(ticket);            }            else            {                entity.Result = false;                entity.Ticket = "";            }            return json<ReturnValueEntity>(entity);        }        [HttpGet]        public IHttpActionResult Get()        {            List<int> list = new List<int>();            list.Add(1);            list.Add(2);            list.Add(3);            list.Add(4);            list.Add(5);            return Json<List<int>>(list);        }    }}

在Login方法上面添加 [AllowAnonymous]特性,表示允许匿名登录。

2、基础认证接口

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Http;using System.Web.Http.Controllers;using System.Web.Security;namespace WebApiBasicAuthorize.CustomerAttribute{    /// <summary>    ///  自定义特性继承自AuthorizeAttribute    /// </summary>    public class BasicAuthorizeAttribute:AuthorizeAttribute    {        public override void OnAuthorization(HttpActionContext actionContext)        {            // 从当前http请求Request对象的头部信息里面获取Authorization属性            var authorization = actionContext.Request.Headers.Authorization;            // 判断控制器获取action方法上面是否有AllowAnonymousAttribute特性,如果有,则允许匿名登录            if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>(true).Count != 0                || actionContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes<AllowAnonymousAttribute>(true).Count != 0)            {                base.OnAuthorization(actionContext);            }            else if (authorization != null && authorization.Parameter != null)            {                // 验证用户逻辑                if (ValidateTicket(authorization.Parameter))                {                    // 验证通过                    base.IsAuthorized(actionContext);                }                else                {                    this.HandleUnauthorizedRequest(actionContext);                }            }            else            {                // 返回401没有授权的状态码                this.HandleUnauthorizedRequest(actionContext);            }        }        /// <summary>        /// 验证Ticket信息        /// </summary>        /// <param name="encryptTicket"></param>        /// <returns></returns>        private bool ValidateTicket(string encryptTicket)        {            // 解密Ticket            var strTicket = FormsAuthentication.Decrypt(encryptTicket).UserData;            // 从Ticket里面获取用户名和密码            int index = strTicket.IndexOf("&");            //string strUser=strTicket            string[] array = strTicket.Split('&');            string strUser = array[0];            string strPwd = array[1];            // 真实生产环境中应该用解密的用户名和密码去数据库验证,这里为了演示方便            // 假定用户名是Admin,密码是123456            if(strUser.Equals("Admin")&&strPwd.Equals("123456"))            {                return true;            }            else            {                return false;            }                   }    }}

3、前端代码

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>权限认证</title>    <script src="Jquery-1.10.2.min.js"></script>    <script>        // 定义全局的ticket变量,用来保存登录成功以后的Ticket值        var ticket;       window.onload=function(){                   };        function Login(){           $.ajax({               url:"http://localhost:20033/api/users?account="+$("#acc").val().trim()+"&password="+$("#pwd").val().trim(),               type:"Get",               dataType:"json",               "headers": {                "Content-Type": "application/json",                "cache-control": "no-cache"              },               success:function(data){                   if(result.Result){                       ticket=data.Ticket;                   }else{                       alert("失败");                   }               },               error:function(data){                   alert(data);               }           });       };        function Test(){           alert(ticket);           $.ajax({               url:'http://localhost:20033/api/users',               type:"Get",               dataType:"json",               beforeSend:function(XHR){                   //发送ajax请求之前向http的head里面加入验证信息                   XHR.setRequestHeader('Authorization','BasicAuth '+ticket);               },               success:function(data){                   alert(data);               },               error:function(data){                   alert(data);               }            });        };    </script></head> <body>    <div>        <div>                <label>用户名:</label>                <input type="text" id="acc">        </div>        <div>                <label>密码:</label>                <input type="password" id="pwd">        </div>        <div>                <input type="button" id="btnLogin" onclick="Login()" value="登录">        </div>        <div>            <input type="button" id="GetAccount" onclick="Test()" value="测试">        </div>    </div></body></html>

这里需要说明的是,我们在发送ajax请求之前,通过XHR.setRequestHeader('Authorization', 'BasicAuth ' + Ticket); 这句向http请求的Head里面添加Ticket信息。

通过上面的几步就可以达到Basic认证的效果了。

注意:后端的WebApi接口要配置允许跨域访问。

4、优化

每增加一个控制器,都需要在相应的控制器上面加[BasicAuthorize]特性,可以定义一个公共的控制器父类,该父类继承自ApiController,然后其他控制器继承该父类。

关于“Web API如何实现Basic基础认证”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Web API如何实现Basic基础认证”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Web API如何实现Basic基础认证

本文链接: https://www.lsjlt.com/news/324632.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Web API如何实现Basic基础认证
    这篇文章主要介绍了Web API如何实现Basic基础认证的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Web API如何实现Basic基础认证文章都会有所收获,下面我们一起来看看吧。一、W...
    99+
    2023-06-29
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
    🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一...
    99+
    2023-08-20
    前端 服务器 网络
  • springsecurity如何实现基于token的认证方式
    这篇文章主要为大家展示了“springsecurity如何实现基于token的认证方式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“springsecurity如何实现基于token的认证方式”...
    99+
    2023-06-20
  • Flask中基于Token的身份认证如何实现
    今天小编给大家分享一下Flask中基于Token的身份认证如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Flask提...
    99+
    2023-07-05
  • .net core api接口如何实现JWT方式认证Token
    这篇文章主要介绍.net core api接口如何实现JWT方式认证Token,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、项目>管理Nuget包 安装二、.appsettings.js...
    99+
    2023-06-22
  • php如何实现实名认证
    今天小编给大家分享一下php如何实现实名认证的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。php实现实名认证的步骤:1、开通...
    99+
    2023-07-04
  • java如何实现license认证
    在Java中实现license认证有多种方法,以下是其中一种常见的方法:1. 创建一个License类,包含许可证的必要信息和属性,...
    99+
    2023-09-05
    java
  • Spring Security如何实现HTTP认证
    今天小编给大家分享一下Spring Security如何实现HTTP认证的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-06-30
  • Spring Boot中如何实现HTTP认证
    这篇文章将为大家详细讲解有关Spring Boot中如何实现HTTP认证,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。HttpBasic 认证有一定的局限性与安全隐患,因此在实际项目中使用并...
    99+
    2023-06-03
  • Linux系统如何实现pam认证
    这期内容当中小编将会给大家带来有关Linux系统如何实现pam认证,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、pam简介:PMA(Pluggable Authentication Module)是一...
    99+
    2023-06-28
  • MySQL如何实现Apache用户认证
    这篇文章主要介绍MySQL如何实现Apache用户认证,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!apache要求DSO方式编译安装,假定apache安装在/usr/local/a...
    99+
    2022-10-18
  • php如何实现Redis连接与认证
    这篇文章给大家分享的是有关php如何实现Redis连接与认证的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Redis连接与认证//连接参数:ip、端口、连接超时时间,连接成功返回...
    99+
    2022-10-19
  • Java SpringSecurity+JWT如何实现登录认证
    这篇文章主要介绍了Java SpringSecurity+JWT如何实现登录认证的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java SpringSecurity+JWT如何实现登录认证文...
    99+
    2023-07-02
  • SpringBoot security安全认证登录如何实现
    本文小编为大家详细介绍“SpringBoot security安全认证登录如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot security安全认证登录如何实现”文章能帮助大家解决疑惑,下面跟...
    99+
    2023-07-05
  • PHP如何实现JWT的Token登录认证
    本篇内容介绍了“PHP如何实现JWT的Token登录认证”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、JWT简介JSON Web Tok...
    99+
    2023-06-21
  • 如何实现ERP基础知识问答
    今天给大家介绍一下如何实现ERP基础知识问答。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。一、        &nbs...
    99+
    2023-06-04
  • JQuery如何实现基础动画操作
    这篇文章主要介绍了JQuery如何实现基础动画操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.jQuery动画效果,隐藏和显示。两个方...
    99+
    2022-10-19
  • php如何实现三网手机实名制认证
    这篇文章主要介绍“php如何实现三网手机实名制认证”,在日常操作中,相信很多人在php如何实现三网手机实名制认证问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php如何实现三网手机实名制认证”的疑惑有所帮助!...
    99+
    2023-07-04
  • SpringBoot如何使用Sa-Token实现权限认证
    今天小编给大家分享一下SpringBoot如何使用Sa-Token实现权限认证的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。...
    99+
    2023-07-06
  • .Net Core中如何写自定义认证实现
    今天就跟大家聊聊有关.Net Core中如何写自定义认证实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、起因 最近项目中需要对项目同时支持JWT认证,以及自定义的认证...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作