前言
身份驗(yàn)證是保護(hù)應(yīng)用程序的基礎(chǔ),并確保用戶(hù)和系統(tǒng)在訪(fǎng)問(wèn)資源之前得到正確驗(yàn)證。經(jīng)歷多年,已經(jīng)出現(xiàn)了多種認(rèn)證方法,每種方法都應(yīng)用在不同的安全需求與技術(shù)環(huán)境。本文介紹C#使用這幾種身份驗(yàn)證方法。
六種方法
1、基本身份驗(yàn)證
基本身份驗(yàn)證(Basic Authentication)主要賴(lài)于用戶(hù)及其擁有的密碼,核心原理是通過(guò)比較用戶(hù)輸入的密碼與預(yù)先存儲(chǔ)的密碼來(lái)確認(rèn)用戶(hù)身份。此方法是一種最基本的用戶(hù)身份驗(yàn)證方式。如果我們把用戶(hù)名和密碼發(fā)送在HTTP請(qǐng)求頭中編碼,也免強(qiáng)可作為Web身份驗(yàn)證方法,但并不建議。由于其缺乏加密,且出現(xiàn)敏感數(shù)據(jù),但它為理解C#中的身份驗(yàn)證提供了一個(gè)簡(jiǎn)單的起點(diǎn)。FTP 使用就是用戶(hù)名和密碼來(lái)驗(yàn)證。using System;
using System.Net;
using System.Text;
namespace Fountain.WinConsole.BasicDemo
{
internal class Program
{
public static void Main()
{
string username = "admin";
string password = "admin6666";
string url = "http://127.0.0.1/api/getOrderData";
string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}"));
WebClient client = new WebClient();
client.Headers[HttpRequestHeader.Authorization] = $"Basic {credentials}";
string response = client.DownloadString(url);
Console.WriteLine(response);
}
}
}
2、摘要認(rèn)證
摘要認(rèn)證(Digest Authentication)是對(duì)基本身份驗(yàn)證的改進(jìn),通過(guò)發(fā)送哈希憑據(jù)而不是賬戶(hù)密碼,防止明文傳輸中賬戶(hù)密碼的泄露,它為防止竊聽(tīng)攻擊提供了更好的安全性。在C#中,摘要身份驗(yàn)證實(shí)現(xiàn)涉及更復(fù)雜的nonce值的散列和處理,通常使用專(zhuān)門(mén)的庫(kù)或框架。(感興趣可以查找相關(guān)內(nèi)容了解)
3、基于 Cookie 的身份驗(yàn)證
基于 Cookie 的身份驗(yàn)證是一種無(wú)狀態(tài)的身份驗(yàn)證機(jī)制,它依賴(lài)于HTTP協(xié)議中的Cookie機(jī)制。成功登錄后,服務(wù)器會(huì)生成一個(gè)包含用戶(hù)身份信息的Cookie,并將其發(fā)送給用戶(hù)的瀏覽器。在后續(xù)的請(qǐng)求中發(fā)送給服務(wù)器,用于識(shí)別用戶(hù)的身份。/// <summary>
/// 登錄
/// </summary>
public static void Login()
{
WebRequest request = WebRequest.Create("http://127.0.0.1:8080/account/login");
request.Credentials = CredentialCache.DefaultCredentials;
string content = Convert.ToBase64String(Encoding.Default.GetBytes(string.Format("{0}:{1}", "admin", "admin666")));
request.Headers.Add("Authorization", "Basic " + content);
WebResponse webResponse = request.GetResponse();
string cookieStriing = webResponse.Headers.Get("Set-Cookie");
}
/// <summary>
/// 獲取訂單
/// </summary>
public static string GetOrders()
{
WebRequest request = WebRequest.Create("http://127.0.0.1:8080/order/getOrders");
request.Credentials = CredentialCache.DefaultCredentials;
request.Headers.Add("Cookie", cookieString);
WebResponse response = request.GetResponse();
return new StreamReader(response.GetResponseStream(), Encoding.Default).ReadToEnd();
}
4、基于 Session 的身份驗(yàn)證
基于 Session 的身份驗(yàn)證是一種依賴(lài)于服務(wù)器端創(chuàng)建和管理用戶(hù)會(huì)話(huà)。它的運(yùn)行基于用戶(hù)登錄、創(chuàng)建會(huì)話(huà)、返回會(huì)話(huà)、保存會(huì)話(huà)、會(huì)話(huà)驗(yàn)證及會(huì)話(huà)過(guò)期與管理。namespace Fountain.WebAPI.SessionDemo
{
public class UsersController : Controller
{
/// <summary>
/// 登錄
/// </summary>
/// <param name="username"></param>
/// <param name="password"></param>
/// <returns></returns>
public ActionResult Login(string username, string password)
{
if (username == "user" && password == "password")
{
// 存儲(chǔ)用戶(hù)會(huì)話(huà)
Session["username"] = username;
return RedirectToAction("Index", "Home");
}
else
{
return View("Login");
}
}
/// <summary>
/// 操作
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
if (Session["username"] != null)
{
// 用戶(hù)已通過(guò)身份驗(yàn)證
}
else
{
// 用戶(hù)身份驗(yàn)證失敗
}
}
}
}
5、基于 JWT的身份驗(yàn)證
JWT 是一種流行的基于令牌的API身份驗(yàn)證方法,它定義了一種緊湊和自包含的方式,用于作為 JSON 對(duì)象在各方之間安全地傳輸信息。此信息可以進(jìn)行驗(yàn)證和信任,因?yàn)樗墙?jīng)過(guò)數(shù)字簽名的。JWT 可以使用HMAC、RSA 或 ECDSA 的公鑰/私鑰對(duì)進(jìn)行簽名。以下是在C#中生成JWT的Token:using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;
namespace Fountain.WinConsole.JWTDemo
{
internal class Program
{
public static void Main()
{
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("supersecretkey"));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
// 生成Token
var token = new JwtSecurityToken(
issuer: "test.example.com",
audience: "test.example.com",
expires: DateTime.Now.AddMinutes(30),
SigningCredentials = SigningCredentials,
);
var tokenString = new JwtSecurityTokenHandler().WriteToken(token);
Console.WriteLine(tokenString);
}
}
}
6、基于 API 密鑰
API密鑰是API請(qǐng)求中作為參數(shù)或標(biāo)頭傳遞的簡(jiǎn)單令牌,用于驗(yàn)證和授權(quán)應(yīng)用程序,其原理與用戶(hù)名和密碼相似。它一般以單一密鑰或一組多個(gè)密鑰的形式出現(xiàn)。應(yīng)用時(shí),應(yīng)該遵循最佳實(shí)踐,改善整體安全性,以防止API密鑰被盜并避免API密鑰泄露的相關(guān)后果。using System;
using System.Net;
using System.Text;
namespace Fountain.WinConsole.APIKeyDemo
{
internal class Program
{
public static void Main()
{
string apiKey = "你的API KEY";
string url = "http://127.0.0.1/api/getOrderData";
WebClient client = new WebClient();
client.Headers.Add("api-key", apiKey);
string response = client.DownloadString(url);
Console.WriteLine(response);
}
}
}
小結(jié)
了解身份驗(yàn)證方法對(duì)于構(gòu)建安全可靠的應(yīng)用程序至關(guān)重要,采用何種方法取決于安全要求、可擴(kuò)展性和用戶(hù)體驗(yàn)等因素。
該文章在 2024/10/19 12:11:51 編輯過(guò)