>백엔드 개발 >C++ >OWIN 미들웨어 없이 ASP.NET 웹 API에서 JWT 인증을 구현하는 방법은 무엇입니까?

OWIN 미들웨어 없이 ASP.NET 웹 API에서 JWT 인증을 구현하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-20 22:39:12829검색

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 토큰을 확인하고 ClaimsPrincipal을 얻으려면 JWT 라이브러리를 사용할 수 있습니다.

<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 웹 API에서 JWT 인증을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.