.NET 幫助

C# OAuth2(開發人員如何使用)

OAuth2 是一個強大的協定,用於通過處理用戶身份驗證和授權來保護您的網絡應用程序。 在 C# 開發領域中,了解 OAuth2 可以大大提升應用程式的安全性和功能性。

本指南專為初學者量身打造,重點在於關鍵概念、實用範例以及易於理解的說明。 我們也會學習一個使用 IronPDF 庫的 OAuth2 用例。

了解 OAuth2 及其重要性

C# OAuth2(對開發人員的運作方式):圖 1 - OAuth2 網頁

OAuth2 是一種協議,允許客戶端應用程式在用戶的授權下,向授權伺服器請求存取資源。 這是一種在現代網路應用程式中處理用戶身份驗證和授權的常見方法。

OAuth2 的主要目標是提供安全且有效的資源存取方式,而不直接與客戶端應用程式共享使用者的憑證(如使用者名稱和密碼)。

OAuth2 的關鍵概念

在深入實施之前,我們來澄清一些基本的 OAuth2 術語:

  • 客戶端應用程式: 請求存取用戶帳號的應用程式。
  • 授權伺服器:對用戶進行身份驗證並向客戶端應用程序發放訪問令牌的伺服器。
  • 訪問令牌:授予客戶端應用程式在有限時間內訪問用戶帳戶的令牌。
  • 刷新令牌: 用於當前訪問令牌過期時獲取新訪問令牌,而不需要再次要求用戶的憑證。
  • 客戶端 ID客戶端密鑰:識別客戶端應用程序到授權伺服器的憑證。
  • 重定向 URI:授權伺服器在授予或拒絕客戶端應用程式存取權後將用戶發送到的 URI。
  • 授權碼流程:一種安全的方法,其中客戶端應用程式會先接收授權碼作為中介步驟,再將其交換為訪問令牌。

在C#中實現OAuth2:基本範例

讓我們創建一個使用OAuth2進行用戶身份驗證的簡單C#應用程式。 此範例將指導您設置 OAuth2 客戶端、獲取訪問令牌,以及向受保護的資源發送請求。

設置您的 OAuth2 客戶端

首先,您需要在 OAuth2 授權伺服器上註冊您的 C# 應用程式。 此過程因伺服器而異,但您通常會收到一個用戶端 ID 和一個用戶端密鑰,這對於 OAuth2 流程至關重要。

步驟 1:定義您的應用程序憑證

首先,設置您的客戶端憑證,如客戶端 ID 和客戶端密鑰。 以下是樣本程式碼:

class Program
{
    private static string clientId = "your-client-id";
    private static string clientSecret = "your-client-secret";
    private static string redirectUri = "your-redirect-uri";
    static void Main(string [] args)
    {
        // OAuth2 implementation will go here
    }
}
class Program
{
    private static string clientId = "your-client-id";
    private static string clientSecret = "your-client-secret";
    private static string redirectUri = "your-redirect-uri";
    static void Main(string [] args)
    {
        // OAuth2 implementation will go here
    }
}
Friend Class Program
	Private Shared clientId As String = "your-client-id"
	Private Shared clientSecret As String = "your-client-secret"
	Private Shared redirectUri As String = "your-redirect-uri"
	Shared Sub Main(ByVal args() As String)
		' OAuth2 implementation will go here
	End Sub
End Class
$vbLabelText   $csharpLabel

步驟 2:請求用戶授權

要啟動 OAuth2 流程,將使用者重定向到授權伺服器的授權端點。 以下是構建授權請求 URL 的方法:

static void Main(string [] args)
{
    var authorizationEndpoint = "https://authorization-server.com/auth";
    var responseType = "code";
    var scope = "email profile";
    var authorizationUrl = $"{authorizationEndpoint}?response_type={responseType}&client_id={clientId}&redirect_uri={redirectUri}&scope={scope}";
    // Redirect the user to authorizationUrl
}
static void Main(string [] args)
{
    var authorizationEndpoint = "https://authorization-server.com/auth";
    var responseType = "code";
    var scope = "email profile";
    var authorizationUrl = $"{authorizationEndpoint}?response_type={responseType}&client_id={clientId}&redirect_uri={redirectUri}&scope={scope}";
    // Redirect the user to authorizationUrl
}
Shared Sub Main(ByVal args() As String)
	Dim authorizationEndpoint = "https://authorization-server.com/auth"
	Dim responseType = "code"
	Dim scope = "email profile"
	Dim authorizationUrl = $"{authorizationEndpoint}?response_type={responseType}&client_id={clientId}&redirect_uri={redirectUri}&scope={scope}"
	' Redirect the user to authorizationUrl
End Sub
$vbLabelText   $csharpLabel

步驟 3:處理授權回應

當用戶授予或拒絕權限後,授權伺服器會將他們重定向回您的應用程式,並附帶授權代碼或錯誤信息。 您需要從重定向 URI 的查詢參數中獲取此代碼。

步驟 4:交換授權碼

現在,您將用授權碼換取存取權杖。 這需要向授權伺服器的 token 端點發送 POST 請求。

public static async Task<string> ExchangeAuthorizationCodeForAccessToken(string authorizationCode)
{
    var tokenEndpoint = "https://authorization-server.com/token";
    var postData = $"grant_type=authorization_code&code={authorizationCode}&redirect_uri={redirectUri}&client_id={clientId}&client_secret={clientSecret}";
    var data = Encoding.ASCII.GetBytes(postData);
    var request = WebRequest.Create(tokenEndpoint);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = data.Length;
    using (var stream = request.GetRequestStream())
    {
        stream.Write(data, 0, data.Length);
    }
    var response = (HttpWebResponse)request.GetResponse();
    var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
    // Extract the access token from the response
    var token = ExtractAccessTokenFromResponse(responseString);
    return token;
}
public static async Task<string> ExchangeAuthorizationCodeForAccessToken(string authorizationCode)
{
    var tokenEndpoint = "https://authorization-server.com/token";
    var postData = $"grant_type=authorization_code&code={authorizationCode}&redirect_uri={redirectUri}&client_id={clientId}&client_secret={clientSecret}";
    var data = Encoding.ASCII.GetBytes(postData);
    var request = WebRequest.Create(tokenEndpoint);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = data.Length;
    using (var stream = request.GetRequestStream())
    {
        stream.Write(data, 0, data.Length);
    }
    var response = (HttpWebResponse)request.GetResponse();
    var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
    // Extract the access token from the response
    var token = ExtractAccessTokenFromResponse(responseString);
    return token;
}
Public Shared Async Function ExchangeAuthorizationCodeForAccessToken(ByVal authorizationCode As String) As Task(Of String)
	Dim tokenEndpoint = "https://authorization-server.com/token"
	Dim postData = $"grant_type=authorization_code&code={authorizationCode}&redirect_uri={redirectUri}&client_id={clientId}&client_secret={clientSecret}"
	Dim data = Encoding.ASCII.GetBytes(postData)
	Dim request = WebRequest.Create(tokenEndpoint)
	request.Method = "POST"
	request.ContentType = "application/x-www-form-urlencoded"
	request.ContentLength = data.Length
	Using stream = request.GetRequestStream()
		stream.Write(data, 0, data.Length)
	End Using
	Dim response = CType(request.GetResponse(), HttpWebResponse)
	Dim responseString = (New StreamReader(response.GetResponseStream())).ReadToEnd()
	' Extract the access token from the response
	Dim token = ExtractAccessTokenFromResponse(responseString)
	Return token
End Function
$vbLabelText   $csharpLabel

此函式向令牌端點發送包含必要數據的POST請求,並返回從響應中提取的存取令牌。

步驟 5:進行授權請求

有了存取權杖,您現在可以向需要身份驗證的資源發送請求。 在授權標頭中將存取令牌附加到您的請求中作為 Bearer 令牌。

public static async Task<string> MakeAuthorizedRequest(string accessToken, string apiUrl)
{
    var request = WebRequest.Create(apiUrl);
    request.Headers.Add("Authorization", $"Bearer {accessToken}");
    var response = (HttpWebResponse)request.GetResponse();
    var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
    return responseString;
}
public static async Task<string> MakeAuthorizedRequest(string accessToken, string apiUrl)
{
    var request = WebRequest.Create(apiUrl);
    request.Headers.Add("Authorization", $"Bearer {accessToken}");
    var response = (HttpWebResponse)request.GetResponse();
    var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
    return responseString;
}
Public Shared Async Function MakeAuthorizedRequest(ByVal accessToken As String, ByVal apiUrl As String) As Task(Of String)
	Dim request = WebRequest.Create(apiUrl)
	request.Headers.Add("Authorization", $"Bearer {accessToken}")
	Dim response = CType(request.GetResponse(), HttpWebResponse)
	Dim responseString = (New StreamReader(response.GetResponseStream())).ReadToEnd()
	Return responseString
End Function
$vbLabelText   $csharpLabel

IronPDF 介紹

C# OAuth2(開發人員如何運作):圖2 - IronPDF 網頁

IronPDF 是一個多功能的庫,適用於 C# 開發者,可讓開發者直接在 .NET 應用程式中生成、操作和渲染 PDF 文件。 這款強大的工具簡化了 PDF 檔的操作,使您能輕鬆製作複雜的文件,輕鬆將 HTML 轉換為 PDF、從 PDF 中提取文字,以及更多功能。 其簡單的 API 允許開發者快速將 PDF 功能整合到他們的應用程式中,而不需要深入了解 PDF 規範。

IronPDF 在HTML 到 PDF 轉換方面表現出色,保持了版面和樣式的完整。 此功能允許從網頁內容生成 PDF,對於報告、發票和文檔非常有用。 它支持將 HTML 文件、網址和 HTML 字串轉換為 PDF。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

		' 1. Convert HTML String to PDF
		Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
		Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
		pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

		' 2. Convert HTML File to PDF
		Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
		Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
		pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

		' 3. Convert URL to PDF
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

程式碼範例:從受保護的內容生成 PDF

假設您有一個只供已驗證用戶存取的返回 HTML 內容的端點。 您可以使用 IronPDF 將這個 HTML 內容轉換為 PDF 文件,利用通過 OAuth2 獲取的訪問令牌。

首先,我們來定義一個方法來使用訪問令牌獲取受保護的HTML內容:

public static async Task<string> FetchProtectedContent(string accessToken, string apiUrl)
{
    var httpClient = new HttpClient();
    httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);
    var response = await httpClient.GetAsync(apiUrl);
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync();
}
public static async Task<string> FetchProtectedContent(string accessToken, string apiUrl)
{
    var httpClient = new HttpClient();
    httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);
    var response = await httpClient.GetAsync(apiUrl);
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync();
}
Public Shared Async Function FetchProtectedContent(ByVal accessToken As String, ByVal apiUrl As String) As Task(Of String)
	Dim httpClient As New HttpClient()
	httpClient.DefaultRequestHeaders.Authorization = New System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken)
	Dim response = Await httpClient.GetAsync(apiUrl)
	response.EnsureSuccessStatusCode()
	Return Await response.Content.ReadAsStringAsync()
End Function
$vbLabelText   $csharpLabel

現在讓我們使用IronPDF將獲取的HTML內容轉換為PDF文件:

public static async Task ConvertHtmlToPdf(string accessToken, string apiUrl, string outputPdfPath)
{
    // Fetch protected content using the access token
    string htmlContent = await FetchProtectedContent(accessToken, apiUrl);
    // Use IronPDF to convert the HTML content to a PDF document
    var renderer = new IronPdf.HtmlToPdf();
    var pdf = renderer.RenderHtmlAsPdf(htmlContent);
    // Save the generated PDF to a file
    pdf.SaveAs(outputPdfPath);
}
public static async Task ConvertHtmlToPdf(string accessToken, string apiUrl, string outputPdfPath)
{
    // Fetch protected content using the access token
    string htmlContent = await FetchProtectedContent(accessToken, apiUrl);
    // Use IronPDF to convert the HTML content to a PDF document
    var renderer = new IronPdf.HtmlToPdf();
    var pdf = renderer.RenderHtmlAsPdf(htmlContent);
    // Save the generated PDF to a file
    pdf.SaveAs(outputPdfPath);
}
Public Shared Async Function ConvertHtmlToPdf(ByVal accessToken As String, ByVal apiUrl As String, ByVal outputPdfPath As String) As Task
	' Fetch protected content using the access token
	Dim htmlContent As String = Await FetchProtectedContent(accessToken, apiUrl)
	' Use IronPDF to convert the HTML content to a PDF document
	Dim renderer = New IronPdf.HtmlToPdf()
	Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
	' Save the generated PDF to a file
	pdf.SaveAs(outputPdfPath)
End Function
$vbLabelText   $csharpLabel

在上述程式碼中,FetchProtectedContent 負責使用 OAuth2 存取權杖從受保護的資源檢索 HTML 內容。 一旦獲取 HTML 內容,就會將其傳遞給 IronPDF 的HtmlToPdf渲染器來生成 PDF 文件,然後將其保存到指定路徑。

結論

C# OAuth2(開發人員如何使用):圖3 - IronPDF 許可證頁面

本指南介紹了在 C# 應用程式中使用 OAuth2 的基本知識,涵蓋了關鍵概念、術語和一個簡單的實作範例。 OAuth2 在透過有效管理用戶身份驗證和授權來保護網路應用程式方面發揮了至關重要的作用。 此範例顯示授權碼流程,但 OAuth2 支援其他適合不同類型應用程式的流程。

通過整合IronPDF for Advanced PDF Manipulation,C# 開發人員可以擴展他們的應用程序功能,包括 PDF 生成和操作,從而豐富認證用戶可用的功能。 IronPDF 的易用性和全面的 PDF 操作功能使其成為尋求在專案中處理 PDF 文件的 .NET 開發人員的極佳工具。 它提供免費試用以探索所有功能,其許可證價格從$749起。

Chipego
奇佩戈·卡林达
軟體工程師
Chipego 擁有天生的傾聽技能,這幫助他理解客戶問題,並提供智能解決方案。他在獲得信息技術理學學士學位後,于 2023 年加入 Iron Software 團隊。IronPDF 和 IronOCR 是 Chipego 專注的兩個產品,但隨著他每天找到新的方法來支持客戶,他對所有產品的了解也在不斷增長。他喜歡在 Iron Software 的協作生活,公司內的團隊成員從各自不同的經歷中共同努力,創造出有效的創新解決方案。當 Chipego 離開辦公桌時,他常常享受讀好書或踢足球的樂趣。
< 上一頁
C# WebRTC(開發人員如何運作)
下一個 >
C# 運算符(如何對開發者起作用)