自学内容网 自学内容网

【C#生态园】一篇文章读懂C#中六大JWT认证库:选择最适合自己的方案

深度比较:六款C# JWT认证库功能对比

前言

在C#开发中,对于JWT(JSON Web Token)的认证和授权处理是常见需求。为了简化开发流程并提高安全性,开发者可以利用现有的JWT认证库来实现这些功能。本文将介绍几个常用的C# JWT认证库,包括它们的功能特点、安装配置方法以及API概览,帮助开发者快速选择适合自己项目的工具。

欢迎订阅专栏:C#生态园

1. Microsoft.IdentityModel.Tokens:一个用于C#的JWT认证库

1.1 简介

Microsoft.IdentityModel.Tokens 是一个用于 C# 的 JSON Web Token (JWT) 认证库,它提供了在.NET应用程序中轻松实现JWT认证所需的核心功能。

1.1.1 核心功能
  • 提供了生成和验证JWT token的功能
  • 支持对JWT token进行签名和加密
  • 提供了一套易于使用的API接口
1.1.2 使用场景

适用于需要在.NET应用程序中使用JWT进行用户身份验证和授权的场景。

1.2 安装与配置

1.2.1 安装指南
Install-Package System.IdentityModel.Tokens.Jwt

可通过NuGet包管理器或者命令行安装 System.IdentityModel.Tokens.Jwt 包。

1.2.2 基本配置

在项目中引入命名空间:

using System.IdentityModel.Tokens.Jwt;
using Microsoft.IdentityModel.Tokens;

1.3 API 概览

1.3.1 Token生成
// 创建Token的Claims
var claims = new[]
{
    new Claim(JwtRegisteredClaimNames.Sub, "username"),
    new Claim(JwtRegisteredClaimNames.Email, "email@example.com"),
    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};

// 密钥
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-secret-key"));

// 签名凭据
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

// 生成JwtSecurityToken
var token = new JwtSecurityToken(
    issuer: "http://example.com",
    audience: "http://example.com",
    claims: claims,
    expires: DateTime.Now.AddMinutes(30),
    signingCredentials: creds
);

// 生成JWT字符串
var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
1.3.2 Token验证
// 获取传入的token
var tokenHandler = new JwtSecurityTokenHandler();
var validationParameters = new TokenValidationParameters
{
    ValidateIssuerSigningKey = true,
    IssuerSigningKey = key,
    ValidateIssuer = true,
    ValidIssuer = "http://example.com",
    ValidateAudience = true,
    ValidAudience = "http://example.com",
    ValidateLifetime = true,
    ClockSkew = TimeSpan.Zero
};

SecurityToken validatedToken;
var principal = tokenHandler.ValidateToken(jwtToken, validationParameters, out validatedToken);

以上是使用 Microsoft.IdentityModel.Tokens 进行JWT token生成和验证的简单示例,更多详细信息可以参考官方文档

2. Jwt.Net:一个用于C#的JWT认证库

2.1 简介

Jwt.Net是一个用于C#的JSON Web Token(JWT)认证库,它提供了简单易用的方式来生成和验证JWT标准规范的令牌。

2.1.1 核心功能
  • 生成JWT令牌
  • 验证JWT令牌的有效性
2.1.2 使用场景

Jwt.Net适用于需要在C#应用程序中实现JWT认证的场景,比如构建安全的API服务或者进行用户认证授权等方面。

2.2 安装与配置

2.2.1 安装指南

你可以通过NuGet包管理器来安装Jwt.Net库,也可以通过.NET CLI执行以下命令:

dotnet add package JWT
2.2.2 基本配置

安装完成后,你可以在C#代码中使用using关键字引入Jwt.Net命名空间:

using JWT;

2.3 API 概览

2.3.1 Token生成
var payload = new Dictionary<string, object>
{
    { "userId", 123 },
    { "username", "exampleuser" }
};

string secretKey = "your_secret_key";

var token = JsonWebToken.Encode(payload, secretKey, JwtHashAlgorithm.HS256);

官网链接:Jwt.Net - Token Generation

2.3.2 Token验证
try
{
    string token = "your_generated_token";
    string secretKey = "your_secret_key";

    var json = JsonWebToken.Decode(token, secretKey);

    // 验证成功后,json中会包含解码后的payload信息
}
catch (TokenExpiredException)
{
    // Token已过期
}
catch (SignatureVerificationException)
{
    // Token签名验证失败
}

官网链接:Jwt.Net - Token Validation

以上就是Jwt.Net库的基本介绍、安装和配置以及Token的生成和验证方法。希望对你有所帮助!

3. Jose.JWT:用于在C#中处理JWT的库

3.1 简介

3.1.1 核心功能

Jose.JWT 提供了在C#中处理JWT的功能,包括创建、解析和验证JWT。

3.1.2 使用场景
  • 用户身份验证
  • 安全的信息传递和存储

3.2 安装与配置

3.2.1 安装方法

你可以使用NuGet包管理器或Package Manager控制台来安装Jose.JWT:

Install-Package Jose.JWT
3.2.2 基本设置

安装完成后,你就可以在项目中使用Jose.JWT提供的功能了。

3.3 API 概览

3.3.1 JWT加密

下面是一个简单的示例,演示如何使用Jose.JWT库来加密JWT:

using System;
using Jose;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var secretKey = Convert.FromBase64String("<YourSecretKey>");
        var payload = new Dictionary<string, object>
        {
            { "username", "john_doe" },
            { "exp", 1300819380 }
        };

        string token = JWT.Encode(payload, secretKey, JwsAlgorithm.HS256);
        Console.WriteLine(token);
    }
}

你可以在 Jose.JWT GitHub 上找到更多关于JWT加密的详细信息。

3.3.2 JWT解密

下面是一个简单的示例,演示如何使用Jose.JWT库来解密JWT:

using System;
using Jose;

class Program
{
    static void Main()
    {
        var token = "<YourJWT>";
        var secretKey = Convert.FromBase64String("<YourSecretKey>");

        string json = JWT.Decode(token, secretKey);
        Console.WriteLine(json);
    }
}

你可以在 Jose.JWT GitHub 上找到更多关于JWT解密的详细信息。

4. System.IdentityModel.Tokens.Jwt:C#中用于JWT生成和验证的库

4.1 简介

System.IdentityModel.Tokens.Jwt是一个在C#中用于JWT生成和验证的库,提供了方���的方法来创建和验证JSON Web Tokens(JWT)。

4.1.1 核心功能
  • 生成JWT:可以使用该库来生成包含特定信息的JWT。
  • 验证JWT:可以验证收到的JWT是否有效。
4.1.2 使用场景

System.IdentityModel.Tokens.Jwt常用于构建基于JWT的身份验证和授权系统,例如在Web应用程序或API中进行用户身份认证。

4.2 安装与配置

4.2.1 安装指南

首先,在Visual Studio中,可以通过NuGet包管理器来安装System.IdentityModel.Tokens.Jwt。也可以使用以下命令行命令进行安装:

PM> Install-Package System.IdentityModel.Tokens.Jwt
4.2.2 基本设置

安装完成后,需要在代码中导入System.IdentityModel.Tokens.Jwt命名空间:

using System.IdentityModel.Tokens.Jwt;

4.3 API 概览

4.3.1 创建JWT

下面是一个使用System.IdentityModel.Tokens.Jwt库创建JWT的示例代码:

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;

public class JwtService
{
    public string GenerateToken(string secretKey, string issuer, string audience)
    {
        var securityKey = new SymmetricSecurityKey(Convert.FromBase64String(secretKey));
        var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

        var claims = new[]
        {
            new Claim(JwtRegisteredClaimNames.Sub, "user_id"),
            new Claim(JwtRegisteredClaimNames.Email, "user@example.com"),
        };

        var token = new JwtSecurityToken(
            issuer: issuer,
            audience: audience,
            claims: claims,
            expires: DateTime.Now.AddMinutes(30),
            signingCredentials: credentials
        );

        return new JwtSecurityTokenHandler().WriteToken(token);
    }
}

以上代码使用了JwtSecurityTokenJwtSecurityTokenHandler类来创建JWT,并使用SigningCredentials来指定加密的密钥。

4.3.2 验证JWT

下面是一个使用System.IdentityModel.Tokens.Jwt库验证JWT的示例代码:

using System;
using System.IdentityModel.Tokens.Jwt;
using Microsoft.IdentityModel.Tokens;

public class JwtService
{
    public bool ValidateToken(string token, string secretKey, string issuer, string audience)
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var validationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = issuer,
            ValidateAudience = true,
            ValidAudience = audience,
            ValidateLifetime = true,
            ClockSkew = TimeSpan.Zero,
            IssuerSigningKey = new SymmetricSecurityKey(Convert.FromBase64String(secretKey))
        };

        try
        {
            SecurityToken validatedToken;
            tokenHandler.ValidateToken(token, validationParameters, out validatedToken);
            return true;
        }
        catch
        {
            return false;
        }
    }
}

以上代码通过JwtSecurityTokenHandlerTokenValidationParameters类来验证JWT的有效性。在实际应用中,需要传入待验证的JWT、密钥等参数进行验证。

以上就是使用System.IdentityModel.Tokens.Jwt库创建和验证JWT的简单示例。

官方链接

5. IdentityServer4:一个用于实现OpenID Connect和OAuth 2.0的库

5.1 简介

IdentityServer4 是一个基于 .NET Core 的开源身份认证和授权解决方案,它提供了针对 OpenID Connect 和 OAuth 2.0 的支持,可帮助开发者构建安全的身份验证和授权系统。

5.1.1 核心功能

IdentityServer4 提供了一系列核心功能,包括颁发和验证令牌、管理API访问权限、集成第三方登录等。

5.1.2 使用场景

适用于需要在 .NET Core 应用程序中实现身份验证和授权的场景,如 Web 应用程序、移动应用程序、API 服务等。

5.2 安装与配置

5.2.1 安装指南

可以通过 NuGet 包管理器来安装 IdentityServer4。在 Visual Studio 中创建或打开一个 .NET Core 项目,然后使用以下命令进行安装:

Install-Package IdentityServer4

更多安装细节和选项可以参考 NuGet Gallery - IdentityServer4

5.2.2 基本设置

在项目中首先需要配置 IdentityServer4 服务,然后定义客户端和 API 资源以及用户信息。

public void ConfigureServices(IServiceCollection services)
{
    var builder = services.AddIdentityServer()
        .AddInMemoryClients(Config.Clients)
        .AddInMemoryIdentityResources(Config.IdentityResources)
        .AddInMemoryApiResources(Config.ApiResources)
        .AddTestUsers(Config.Users);
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseIdentityServer();
}

5.3 API 概览

5.3.1 OpenID Connect集成

IdentityServer4 可以轻松集成 OpenID Connect 来实现跨域单点登录(SSO)。以下是一个简单的示例代码:

var builder = services.AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = "oidc";
    })
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddOpenIdConnect("oidc", options =>
    {
        options.Authority = "http://localhost:5000";
        options.RequireHttpsMetadata = false;

        options.ClientId = "mvc";
        options.ClientSecret = "secret";
        options.ResponseType = "code";

        options.SaveTokens = true;
    });
5.3.2 OAuth 2.0授权

IdentityServer4 还支持 OAuth 2.0 授权框架,可以用于保护 Web API。以下是一个简单的示例代码:

[Route("api/resource")]
[Authorize]
public class ResourceController : Controller
{
    [HttpGet]
    public IActionResult Get()
    {
        return Ok(new { Data = "Some sensitive data." });
    }
}

更多关于 IdentityServer4 的详细信息,请参阅 IdentityServer4 官方文档

6. IdentityModel:用于客户端与IdentityServer通信的库

6.1 简介

6.1.1 核心功能

IdentityModel是一个用于客户端与IdentityServer通信的库,提供了方便的方法来请求token、刷新token等功能。

6.1.2 使用场景

适用于需要在客户端与IdentityServer之间进行安全认证和授权的场景,例如在前端应用中请求访问受保护的API时使用。

6.2 安装与配置

6.2.1 安装指南

可以通过NuGet包管理器或.NET CLI来安装IdentityModel。在NuGet包管理器中搜索IdentityModel并进行安装:

Install-Package IdentityModel

使用.NET CLI安装:

dotnet add package IdentityModel
6.2.2 基本设置

安装完IdentityModel后,在使用前需要引入相应的命名空间:

using IdentityModel.Client;

6.3 API 概览

6.3.1 请求Token

使用IdentityModel请求token的示例代码如下:

var client = new HttpClient();

var disco = await client.GetDiscoveryDocumentAsync("https://demo.identityserver.io");
if (disco.IsError)
{
    Console.WriteLine(disco.Error);
    return;
}

var tokenResponse = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
    Address = disco.TokenEndpoint,
    ClientId = "client",
    ClientSecret = "secret",
    Scope = "api1"
});

if (tokenResponse.IsError)
{
    Console.WriteLine(tokenResponse.Error);
    return;
}

Console.WriteLine(tokenResponse.Json);

以上代码首先使用GetDiscoveryDocumentAsync获取IdentityServer的元数据,然后使用RequestClientCredentialsTokenAsync方法请求token,并验证返回结果。

官方链接:IdentityModel - 请求Token

6.3.2 刷新Token

IdentityModel也提供了刷新token的方法,示例代码如下:

var client = new HttpClient();

var disco = await client.GetDiscoveryDocumentAsync("https://demo.identityserver.io");
if (disco.IsError)
{
    Console.WriteLine(disco.Error);
    return;
}

var tokenResponse = await client.RequestRefreshTokenAsync(new RefreshTokenRequest
{
    Address = disco.TokenEndpoint,
    ClientId = "client",
    ClientSecret = "secret",
    RefreshToken = "refresh_token"
});

if (tokenResponse.IsError)
{
    Console.WriteLine(tokenResponse.Error);
    return;
}

Console.WriteLine(tokenResponse.Json);

以上代码使用RequestRefreshTokenAsync方法发送刷新token的请求,并验证返回结果。

官方链接:IdentityModel - 刷新Token

总结

C#中有多个优秀的JWT认证库可供选择,例如Microsoft.IdentityModel.Tokens, Jwt.Net, Jose.JWT, System.IdentityModel.Tokens.Jwt, IdentityServer4 和 IdentityModel。每个库都有其独特的功能特点和适用场景,开发者可以根据自身项目需求和技术背景进行权衡选择。同时,合理的安装配置和深入的API概览也是选择合适JWT认证库的关键因素。通过本文的介绍,读者将能够更好地理解这些库的优势和不足,并为自己的项目选取最适合的工具。


原文地址:https://blog.csdn.net/qq_42531954/article/details/142642317

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!