Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Melaksanakan Pengesahan JWT dalam API Web ASP.NET Tanpa OWIN Middleware?

Bagaimana untuk Melaksanakan Pengesahan JWT dalam API Web ASP.NET Tanpa OWIN Middleware?

Barbara Streisand
Barbara Streisandasal
2025-01-20 22:39:12899semak imbas

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

Melaksanakan Pengesahan JWT dalam API Web ASP.NET tanpa perisian tengah OWIN

Artikel ini menerangkan cara melaksanakan pengesahan JWT dalam versi lama API Web ASP.NET tanpa perisian tengah OWIN. Prinsip teras adalah untuk mengeluarkan token JWT dan mengesahkannya apabila permintaan diterima.

Titik akhir penjanaan token

Menyediakan titik akhir token di mana pengguna boleh mendapatkan token JWT, mis

<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>

Gunakan System.IdentityModel.Tokens.Jwt untuk menjana token

Jana token menggunakan pakej System.IdentityModel.Tokens.Jwt NuGet dan kunci simetri 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>

Gunakan penapis pengesahan untuk pengesahan JWT

Untuk pengesahan JWT, buat penapis pengesahan tersuai yang diwarisi daripada

: IAuthenticationFilter

<code class="language-csharp">public class ValueController : ApiController
{
    [JwtAuthentication] // 自定义过滤器属性
    public string Get()
    {
        return "value";
    }
}</code>
Dalam penapis pengesahan, laksanakan logik pengesahan dan kembalikan

: 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>

Pengesahan JWT menggunakan perpustakaan JWT

Untuk mengesahkan token JWT dan mendapatkan

, anda boleh menggunakan perpustakaan JWT: ClaimsPrincipal

<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>

Keizinan

Untuk menghalang permintaan tanpa nama, tambahkan konfigurasi global berikut:

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

Ujian Posmen

Minta token menggunakan Posmen:

<code>GET http://localhost:{port}/api/token?username=cuong&password=1</code>
Gunakan token JWT yang diperolehi dalam pengepala permintaan kebenaran:

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

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImN1b25nIiwibmJmIjoxNDc3NTY1MjU4LCJleHAiOjE0Nzc1NjY0NTgsImlhdCI6MTQ3NzU2NTI1OH0.dSwwufd4-gztkLpttZsZ1255oEzpWCJkayR_4yvNL1s</code>
Sila ambil perhatian bahawa

kaedah dan bahagian pengendalian ralat dalam kod perlu diperbaiki mengikut aplikasi sebenar. CheckUser Kunci juga harus disimpan di tempat yang lebih selamat dan bukannya dikodkan secara langsung dalam kod. Ini hanyalah contoh ringkas, dan mekanisme pengendalian keselamatan dan ralat yang lebih komprehensif perlu dipertimbangkan dalam aplikasi sebenar. Secret

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Pengesahan JWT dalam API Web ASP.NET Tanpa OWIN Middleware?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn