Heim > Backend-Entwicklung > C++ > Wie implementiert man die JWT-Authentifizierung in der ASP.NET-Web-API ohne OWIN-Middleware?

Wie implementiert man die JWT-Authentifizierung in der ASP.NET-Web-API ohne OWIN-Middleware?

Barbara Streisand
Freigeben: 2025-01-20 22:39:12
Original
824 Leute haben es durchsucht

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

Implementierung der JWT-Authentifizierung in der ASP.NET-Web-API ohne OWIN-Middleware

In diesem Artikel wird beschrieben, wie die JWT-Authentifizierung in der alten Version der ASP.NET-Web-API ohne OWIN-Middleware implementiert wird. Das Kernprinzip besteht darin, JWT-Tokens auszustellen und diese zu validieren, wenn eine Anfrage eingeht.

Token-Generierungsendpunkt

Stellt einen Token-Endpunkt bereit, über den Benutzer ein JWT-Token erhalten können, z. B. mithilfe einer einfachen Implementierung einer Controller-Aktion:

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

Verwenden Sie System.IdentityModel.Tokens.Jwt, um Token zu generieren

Generieren Sie Token mit dem NuGet-Paket System.IdentityModel.Tokens.Jwt und dem symmetrischen Schlüssel 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>
Nach dem Login kopieren

Authentifizierungsfilter für JWT-Überprüfung verwenden

Erstellen Sie für die JWT-Validierung einen benutzerdefinierten Authentifizierungsfilter, der von IAuthenticationFilter geerbt wurde:

<code class="language-csharp">public class ValueController : ApiController
{
    [JwtAuthentication] // 自定义过滤器属性
    public string Get()
    {
        return "value";
    }
}</code>
Nach dem Login kopieren

Implementieren Sie im Authentifizierungsfilter die Verifizierungslogik und geben Sie ClaimsPrincipal zurück:

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

JWT-Verifizierung mithilfe der JWT-Bibliothek

Um das JWT-Token zu überprüfen und ClaimsPrincipal zu erhalten, können Sie die JWT-Bibliothek verwenden:

<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

Um anonyme Anfragen zu verhindern, fügen Sie die folgende globale Konfiguration hinzu:

<code class="language-csharp">config.Filters.Add(new AuthorizeAttribute());</code>
Nach dem Login kopieren

Postman-Test

Anfordern eines Tokens mit Postman:

<code>GET http://localhost:{port}/api/token?username=cuong&password=1</code>
Nach dem Login kopieren

Verwenden Sie das erhaltene JWT-Token im Header der Autorisierungsanfrage:

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

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImN1b25nIiwibmJmIjoxNDc3NTY1MjU4LCJleHAiOjE0Nzc1NjY0NTgsImlhdCI6MTQ3NzU2NTI1OH0.dSwwufd4-gztkLpttZsZ1255oEzpWCJkayR_4yvNL1s</code>
Nach dem Login kopieren

Bitte beachten Sie, dass die CheckUser Methoden und Fehlerbehandlungsteile im Code entsprechend den tatsächlichen Anwendungen verbessert werden müssen. Secret Schlüssel sollten außerdem an einem sichereren Ort gespeichert werden, anstatt direkt im Code fest codiert zu werden. Dies ist nur ein vereinfachtes Beispiel. In tatsächlichen Anwendungen müssen umfassendere Sicherheits- und Fehlerbehandlungsmechanismen berücksichtigt werden.

Das obige ist der detaillierte Inhalt vonWie implementiert man die JWT-Authentifizierung in der ASP.NET-Web-API ohne OWIN-Middleware?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage