Heim > Backend-Entwicklung > C++ > Wie implementiert man die JWT-Bearer-Token-Authentifizierung in der auf IIS gehosteten ASP.NET-Web-API?

Wie implementiert man die JWT-Bearer-Token-Authentifizierung in der auf IIS gehosteten ASP.NET-Web-API?

DDD
Freigeben: 2025-01-20 22:47:09
Original
503 Leute haben es durchsucht

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

Implementierung der JWT-Bearer-Token-Authentifizierung in der auf IIS gehosteten ASP.NET-Web-API

Die Implementierung der JWT-Bearer-Token-Authentifizierung in der auf IIS gehosteten ASP.NET-Web-API erfordert einen anderen Ansatz als bei .NET Core- oder OWIN-Anwendungen. Dieser Artikel bietet eine umfassende Anleitung zur Implementierung dieses Authentifizierungsmechanismus und beantwortet wichtige Fragen:

Wie erstelle ich ein JWT-Token?

Um JWT-Tokens zu generieren, können Sie das NuGet-Paket System.IdentityModel.Tokens.Jwt verwenden. Hier ist ein Beispiel mit HMACSHA256 und einem symmetrischen Schlüssel:

<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>
Nach dem Login kopieren

Wie stellt man ein JWT-Token bereit?

Eine einfache Möglichkeit besteht darin, einen Token-Endpunkt in der Controller-Aktion zu erstellen:

<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>
Nach dem Login kopieren

Wie verifiziert man das JWT-Token?

Ein anderer Ansatz besteht darin, ein JWTAuthenticationAttribute zu erstellen, das von IAuthenticationFilter erbt:

<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>
Nach dem Login kopieren

Diese Eigenschaft kann auf bestimmte Aktionen angewendet werden:

<code class="language-csharp">public class ValueController : ApiController
{
    [JwtAuthentication]
    public string Get()
    {
        return "value";
    }
}</code>
Nach dem Login kopieren

JWT-Token über Middleware oder DelegateHandler validieren?

OWIN-Middleware oder DelegateHandler können auch zur Authentifizierung aller eingehenden Anfragen an die Web-API verwendet werden.

JWT-Token überprüfen

Der folgende Code validiert das JWT-Token und gibt den Text zurück:

<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>
Nach dem Login kopieren

Autorisierung

Denken Sie daran, config.Filters.Add(new AuthorizeAttribute()); global hinzuzufügen, um anonyme Anfragen zu verhindern.

Das obige ist der detaillierte Inhalt vonWie implementiert man die JWT-Bearer-Token-Authentifizierung in der auf IIS gehosteten ASP.NET-Web-API?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage