91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Web?API如何實現Basic基礎認證

發布時間:2022-03-14 09:10:29 來源:億速云 閱讀:141 作者:iii 欄目:開發技術

這篇文章主要介紹了Web API如何實現Basic基礎認證的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Web API如何實現Basic基礎認證文章都會有所收獲,下面我們一起來看看吧。

一、WebApi中為什么需要身份認證

我們在使用WebApi的時候,都是通過URL去獲取數據。也就是說,任何人只要知道了URL地址,就能隨意的訪問后臺的服務接口,就可以訪問或者修改數據庫數據了,這樣就會導致很嚴重的后果。

1、我們不加身份認證,匿名用戶可以直接通過url隨意訪問接口:

Web?API如何實現Basic基礎認證

2、增加了身份認證之后,只有帶了票據的請求才能訪問對應的接口。

Web?API如何實現Basic基礎認證

二、常見的認證方式

WebApi中常見的認證方式有如下幾種:

  • FORM身份驗證

  • 集成WINDOWS驗證

  • Basic基礎認證

  • Digest摘要認證

三、Basic基礎認證

Basic基礎認證原理

Basic認證的基本原理就是加密用戶信息生成Ticket,每次請求后端API接口的時候把生成的Ticket信息加到http請求的頭部傳給后端進行驗證。具體步驟如下:

  • 1、登錄的時候驗證用戶名和密碼,如果驗證通過,則將用戶名和密碼按照一定的規則生成加密后的票據信息Ticket,然后將Ticket傳遞到前端。

  • 2、如果登錄成功,前端定義一個全局的變量接收API接口返回的Ticket信息。

  • 3、前端界面再次發起ajax請求后端API接口的時候,將Ticket信息加入到HTTP請求的Head里面,將Ticket信息隨著http請求一起發送到后端API接口。

  • 4、在后端的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基礎認證”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芦山县| 正定县| 维西| 望奎县| 仪征市| 政和县| 来安县| 临颍县| 柘荣县| 桦川县| 固安县| 麻江县| 弋阳县| 阳泉市| 册亨县| 河津市| 廉江市| 银川市| 通州市| 栾川县| 沙田区| 内丘县| 余姚市| 唐河县| 遂平县| 桃源县| 桓台县| 太仓市| 依兰县| 晋州市| 微博| 府谷县| 庆阳市| 阳原县| 香港| 泗水县| 宁德市| 滦南县| 谢通门县| 高要市| 沭阳县|