Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Melaksanakan Pengesahan Token Pembawa JWT dalam API Web ASP.NET Dihoskan pada IIS?

Bagaimana untuk Melaksanakan Pengesahan Token Pembawa JWT dalam API Web ASP.NET Dihoskan pada IIS?

DDD
DDDasal
2025-01-20 22:47:09548semak imbas

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

Melaksanakan pengesahan token Pembawa JWT dalam API Web ASP.NET yang dihoskan pada IIS

Melaksanakan pengesahan token pembawa JWT dalam API Web ASP.NET yang dihoskan pada IIS memerlukan pendekatan yang berbeza berbanding dengan aplikasi .NET Core atau OWIN. Artikel ini menyediakan panduan komprehensif tentang cara melaksanakan mekanisme pengesahan ini dan menjawab soalan utama:

Bagaimana untuk menjana token JWT?

Untuk menjana token JWT, anda boleh menggunakan pakej System.IdentityModel.Tokens.Jwt NuGet. Berikut ialah contoh menggunakan HMACSHA256 dan kunci simetri:

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

Bagaimana untuk menyediakan token JWT?

Cara mudah ialah mencipta titik akhir token dalam tindakan pengawal:

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

Bagaimana untuk mengesahkan token JWT?

Pendekatan lain ialah mencipta JWTAuthenticationAttribute yang diwarisi daripada 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>

Harta ini boleh digunakan pada tindakan tertentu:

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

Sahkan token JWT melalui middleware atau DelegateHandler?

OWIN middleware atau DelegateHandler juga boleh digunakan untuk mengesahkan semua permintaan masuk ke API Web.

Sahkan token JWT

Kod berikut mengesahkan token JWT dan mengembalikan badan:

<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

Ingat untuk menambah config.Filters.Add(new AuthorizeAttribute()); secara global untuk mengelakkan permintaan tanpa nama.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Pengesahan Token Pembawa JWT dalam API Web ASP.NET Dihoskan pada IIS?. 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