.NET 帮助

C# OAuth2(开发人员如何使用)

OAuth2 是一个强大的协议,通过处理用户身份验证和授权来保护您的网络应用程序。 在 C# 开发领域,了解 OAuth2 可以大大提高应用程序的安全性和功能性。

本指南专为初学者量身定制,侧重于关键概念、实用示例和通俗易懂的解释。 我们还将学习一个使用OAuth2与IronPDF库的用例。

了解 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:交换授权码

现在,您要将授权代码换成访问令牌。 这需要向授权服务器的令牌端点发出 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:提出授权请求

有了访问令牌,您就可以向需要身份验证的资源提出请求了。 在授权标头中将访问令牌作为承载令牌附加到您的请求中。

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 文件、URL 和 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 内容只有通过身份验证的用户才能访问。 您可以利用通过 OAuth2 获取的访问令牌,使用 IronPdf 将此 HTML 内容转换为 PDF 文档。

首先,让我们定义一个使用访问令牌获取受保护 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# 操作符(开发人员如何使用)