Maison > développement back-end > C++ > Comment implémenter l'authentification JWT dans l'API Web ASP.NET sans middleware OWIN ?

Comment implémenter l'authentification JWT dans l'API Web ASP.NET sans middleware OWIN ?

Barbara Streisand
Libérer: 2025-01-20 22:39:12
original
823 Les gens l'ont consulté

How to Implement JWT Authentication in ASP.NET Web API Without OWIN Middleware?

Implémentation de l'authentification JWT dans l'API Web ASP.NET sans middleware OWIN

Cet article décrit comment implémenter l'authentification JWT dans l'ancienne version de l'API Web ASP.NET sans middleware OWIN. Le principe de base est d'émettre des jetons JWT et de les valider lorsqu'une demande est reçue.

Point de terminaison de génération de jetons

Fournit un point de terminaison de jeton où les utilisateurs peuvent obtenir un jeton JWT, par exemple en utilisant une simple implémentation d'une action de contrôleur :

<code class="language-csharp">public class TokenController : ApiController
{
    [AllowAnonymous]
    public string Get(string username, string password)
    {
        if (CheckUser(username, password))
        {
            return JwtManager.GenerateToken(username);
        }

        throw new HttpResponseException(HttpStatusCode.Unauthorized);
    }

    private bool CheckUser(string username, string password)
    {
        // 应在数据库中进行检查
        return true; //  此处应替换为实际的用户验证逻辑
    }
}</code>
Copier après la connexion

Utilisez System.IdentityModel.Tokens.Jwt pour générer des jetons

Générez des jetons à l'aide du package System.IdentityModel.Tokens.Jwt NuGet et de la clé symétrique HMACSHA256 :

<code class="language-csharp">/// <summary>
/// 使用以下代码生成对称密钥
///     var hmac = new HMACSHA256();
///     var key = Convert.ToBase64String(hmac.Key);
/// </summary>
private const string Secret = "db3OIsj+BXE9NZDy0t8W3TcNekrF+2d/1sFnWG4HnV8TZY30iTOdtVWJG8abWvB1GlOgJuQZdcF2Luqm/hccMw==";

public static string GenerateToken(string username, int expireMinutes = 20)
{
    var symmetricKey = Convert.FromBase64String(Secret);
    var tokenHandler = new JwtSecurityTokenHandler();

    var now = DateTime.UtcNow;
    var tokenDescriptor = new SecurityTokenDescriptor
    {
        Subject = new ClaimsIdentity(new[]
        {
            new Claim(ClaimTypes.Name, username)
        }),

        Expires = now.AddMinutes(expireMinutes),

        SigningCredentials = new SigningCredentials(
            new SymmetricSecurityKey(symmetricKey),
            SecurityAlgorithms.HmacSha256Signature)
    };

    var stoken = tokenHandler.CreateToken(tokenDescriptor);
    var token = tokenHandler.WriteToken(stoken);

    return token;
}</code>
Copier après la connexion

Utiliser le filtre d'authentification pour la vérification JWT

Pour la validation JWT, créez un filtre d'authentification personnalisé hérité de IAuthenticationFilter :

<code class="language-csharp">public class ValueController : ApiController
{
    [JwtAuthentication] // 自定义过滤器属性
    public string Get()
    {
        return "value";
    }
}</code>
Copier après la connexion

Dans le filtre d'authentification, implémentez la logique de vérification et renvoyez ClaimsPrincipal :

<code class="language-csharp">protected Task<IPrincipal> AuthenticateJwtToken(string token)
{
    string username;

    if (ValidateToken(token, out username))
    {
        // 基于用户名,从数据库获取更多信息以构建本地标识
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, username)
            // 根据需要添加更多声明:角色等
        };

        var identity = new ClaimsIdentity(claims, "Jwt");
        IPrincipal user = new ClaimsPrincipal(identity);

        return Task.FromResult(user);
    }

    return Task.FromResult<IPrincipal>(null);
}</code>
Copier après la connexion

Vérification JWT à l'aide de la bibliothèque JWT

Afin de vérifier le token JWT et d'obtenir ClaimsPrincipal, vous pouvez utiliser la bibliothèque JWT :

<code class="language-csharp">public static ClaimsPrincipal GetPrincipal(string token)
{
    try
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var jwtToken = tokenHandler.ReadToken(token) as JwtSecurityToken;

        if (jwtToken == null)
            return null;

        var symmetricKey = Convert.FromBase64String(Secret);

        var validationParameters = new TokenValidationParameters()
        {
            RequireExpirationTime = true,
            ValidateIssuer = false,
            ValidateAudience = false,
            IssuerSigningKey = new SymmetricSecurityKey(symmetricKey)
        };

        SecurityToken securityToken;
        var principal = tokenHandler.ValidateToken(token, validationParameters, out securityToken);

        return principal;
    }
    catch (Exception)
    {
        // 应写入日志
        return null;
    }
}</code>
Copier après la connexion

Autorisation

Pour éviter les demandes anonymes, ajoutez la configuration globale suivante :

<code class="language-csharp">config.Filters.Add(new AuthorizeAttribute());</code>
Copier après la connexion

Test du facteur

Demander un jeton en utilisant Postman :

<code>GET http://localhost:{port}/api/token?username=cuong&password=1</code>
Copier après la connexion

Utilisez le token JWT obtenu dans l'en-tête de la demande d'autorisation :

<code>GET http://localhost:{port}/api/value

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImN1b25nIiwibmJmIjoxNDc3NTY1MjU4LCJleHAiOjE0Nzc1NjY0NTgsImlhdCI6MTQ3NzU2NTI1OH0.dSwwufd4-gztkLpttZsZ1255oEzpWCJkayR_4yvNL1s</code>
Copier après la connexion

Veuillez noter que les CheckUser méthodes et parties de gestion des erreurs dans le code doivent être améliorées en fonction des applications réelles. Secret Les clés doivent également être stockées dans un endroit plus sécurisé plutôt que d'être codées en dur directement dans le code. Ceci n'est qu'un exemple simplifié, et des mécanismes de sécurité et de gestion des erreurs plus complets doivent être pris en compte dans les applications réelles.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal