ホームページ > バックエンド開発 > C++ > OWIN ミドルウェアを使用せずに ASP.NET Web API に JWT 認証を実装するにはどうすればよいですか?

OWIN ミドルウェアを使用せずに ASP.NET Web API に JWT 認証を実装するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-20 22:39:12
オリジナル
823 人が閲覧しました

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

OWIN ミドルウェアを使用しない ASP.NET Web API での JWT 認証の実装

この記事では、OWIN ミドルウェアを使用せずに、古いバージョンの ASP.NET Web API で JWT 認証を実装する方法について説明します。基本的な原則は、JWT トークンを発行し、リクエストを受信したときにそれを検証することです。

トークン生成エンドポイント

ユーザーが JWT トークンを取得できるトークン エンドポイントを提供します。たとえば、コントローラー アクションの単純な実装を使用します。

<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>
ログイン後にコピー

System.IdentityModel.Tokens.Jwt を使用してトークンを生成します

System.IdentityModel.Tokens.Jwt NuGet パッケージと 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>
ログイン後にコピー

JWT 検証に認証フィルターを使用する

JWT 検証の場合、

から継承したカスタム認証フィルターを作成します: IAuthenticationFilter

<code class="language-csharp">public class ValueController : ApiController
{
    [JwtAuthentication] // 自定义过滤器属性
    public string Get()
    {
        return "value";
    }
}</code>
ログイン後にコピー
認証フィルターで検証ロジックを実装し、

を返します: 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>
ログイン後にコピー

JWT ライブラリを使用した JWT 検証

JWT トークンを検証して

を取得するには、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>
ログイン後にコピー

承認

匿名リクエストを防ぐには、次のグローバル構成を追加します:

<code class="language-csharp">config.Filters.Add(new AuthorizeAttribute());</code>
ログイン後にコピー

郵便配達員テスト

Postman を使用してトークンをリクエストします:

<code>GET http://localhost:{port}/api/token?username=cuong&password=1</code>
ログイン後にコピー
取得した JWT トークンを認可リクエストのヘッダーで使用します:

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

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImN1b25nIiwibmJmIjoxNDc3NTY1MjU4LCJleHAiOjE0Nzc1NjY0NTgsImlhdCI6MTQ3NzU2NTI1OH0.dSwwufd4-gztkLpttZsZ1255oEzpWCJkayR_4yvNL1s</code>
ログイン後にコピー
コード内の

メソッドとエラー処理部分は、実際のアプリケーションに応じて改善する必要があることに注意してください。 CheckUser キーは、コードに直接ハードコーディングするのではなく、より安全な場所に保存する必要もあります。 これは単なる例であり、実際のアプリケーションでは、より包括的なセキュリティとエラー処理メカニズムを考慮する必要があります。 Secret

以上がOWIN ミドルウェアを使用せずに ASP.NET Web API に JWT 認証を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート