Maison > développement back-end > C++ > Comment implémenter l'authentification par jeton du porteur JWT dans l'API Web ASP.NET hébergée sur IIS ?

Comment implémenter l'authentification par jeton du porteur JWT dans l'API Web ASP.NET hébergée sur IIS ?

DDD
Libérer: 2025-01-20 22:47:09
original
502 Les gens l'ont consulté

How to Implement JWT Bearer Token Authentication in ASP.NET Web API Hosted on IIS?

Implémentation de l'authentification par jeton JWT Bearer dans l'API Web ASP.NET hébergée sur IIS

La mise en œuvre de l'authentification par jeton du porteur JWT dans l'API Web ASP.NET hébergée sur IIS nécessite une approche différente par rapport aux applications .NET Core ou OWIN. Cet article fournit un guide complet sur la façon de mettre en œuvre ce mécanisme d'authentification et répond aux questions clés :

Comment générer un token JWT ?

Pour générer des jetons JWT, vous pouvez utiliser le package System.IdentityModel.Tokens.Jwt NuGet. Voici un exemple utilisant HMACSHA256 et une clé symétrique :

<code class="language-csharp">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(Convert.ToInt32(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

Comment fournir un jeton JWT ?

Un moyen simple consiste à créer un point de terminaison de jeton dans l'action du 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);
    }

    public bool CheckUser(string username, string password)
    {
        // 应该在数据库中检查
        return true;
    }
}</code>
Copier après la connexion

Comment vérifier le jeton JWT ?

Une autre approche consiste à créer un JWTAuthenticationAttribute qui hérite de IAuthenticationFilter :

<code class="language-csharp">private static bool ValidateToken(string token, out string username)
{
    username = null;

    var simplePrinciple = JwtManager.GetPrincipal(token);
    var identity = simplePrinciple.Identity as ClaimsIdentity;

    if (identity == null || !identity.IsAuthenticated)
        return false;

    var usernameClaim = identity.FindFirst(ClaimTypes.Name);
    username = usernameClaim?.Value;

    if (string.IsNullOrEmpty(username))
        return false;

    // 更多验证以检查系统中用户名是否存在

    return true;
}

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

Cette propriété peut être appliquée à des actions spécifiques :

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

Valider le jeton JWT via middleware ou DelegateHandler ?

Le middleware OWIN ou DelegateHandler peut également être utilisé pour authentifier toutes les requêtes entrantes auprès de l'API Web.

Vérifier le jeton JWT

Le code suivant valide le token JWT et renvoie le corps :

<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

N'oubliez pas d'ajouter config.Filters.Add(new AuthorizeAttribute()); globalement pour éviter les demandes anonymes.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal