> 백엔드 개발 > C++ > IIS에서 호스팅되는 ASP.NET 웹 API에서 JWT 전달자 토큰 인증을 구현하는 방법은 무엇입니까?

IIS에서 호스팅되는 ASP.NET 웹 API에서 JWT 전달자 토큰 인증을 구현하는 방법은 무엇입니까?

DDD
풀어 주다: 2025-01-20 22:47:09
원래의
501명이 탐색했습니다.

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

IIS에서 호스팅되는 ASP.NET 웹 API에서 JWT 전달자 토큰 인증 구현

IIS에서 호스팅되는 ASP.NET Web API에서 JWT 전달자 토큰 인증을 구현하려면 .NET Core 또는 OWIN 애플리케이션과 다른 접근 방식이 필요합니다. 이 문서에서는 이 인증 메커니즘을 구현하는 방법에 대한 포괄적인 가이드를 제공하고 주요 질문에 답변합니다.

JWT 토큰은 어떻게 생성하나요?

JWT 토큰을 생성하려면 System.IdentityModel.Tokens.Jwt NuGet 패키지를 사용할 수 있습니다. 다음은 HMACSHA256 및 대칭 키를 사용하는 예입니다.

<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>
로그인 후 복사

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);
    }

    public bool CheckUser(string username, string password)
    {
        // 应该在数据库中检查
        return true;
    }
}</code>
로그인 후 복사

JWT 토큰을 어떻게 검증하나요?

또 다른 접근 방식은 IAuthenticationFilter에서 상속되는 JWTAuthenticationAttribute를 만드는 것입니다.

<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>
로그인 후 복사

이 속성은 특정 작업에 적용될 수 있습니다.

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

미들웨어 또는 DelegateHandler를 통해 JWT 토큰을 검증하시겠습니까?

OWIN 미들웨어 또는 DelegateHandler를 사용하여 Web API로 들어오는 모든 요청을 인증할 수도 있습니다.

JWT 토큰 확인

다음 코드는 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>
로그인 후 복사

승인

익명 요청을 방지하려면 전역적으로 config.Filters.Add(new AuthorizeAttribute());을 추가하는 것을 잊지 마세요.

위 내용은 IIS에서 호스팅되는 ASP.NET 웹 API에서 JWT 전달자 토큰 인증을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿