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
Lepaskan: 2025-01-20 22:39:12
asal
824 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk
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>
Salin selepas log masuk

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>
Salin selepas log masuk

Keizinan

Untuk menghalang permintaan tanpa nama, tambahkan konfigurasi global berikut:

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

Ujian Posmen

Minta token menggunakan Posmen:

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

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

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImN1b25nIiwibmJmIjoxNDc3NTY1MjU4LCJleHAiOjE0Nzc1NjY0NTgsImlhdCI6MTQ3NzU2NTI1OH0.dSwwufd4-gztkLpttZsZ1255oEzpWCJkayR_4yvNL1s</code>
Salin selepas log masuk
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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan