簡體   English   中英

根據請求讀取並驗證JWT令牌

[英]Read and Validate JWT token per request

我有一個場景,其中有許多單獨的客戶端通過JWT令牌連接。

  1. 客戶端(瀏覽器)首先需要登錄(並獲得JWT令牌)
  2. 然后,客戶端需要檢索其帳戶信息,他們通過向服務器(包括JWT令牌)發送請求來進行此操作。服務器(可以訪問機密)可以安全地讀取JWT令牌,並應將用戶發回信息,我該怎么做?

ps每個客戶端都有一個不同的秘密

我可以針對每個應用執行此操作

app.UseJwtBearerAuthentication(
                new JwtBearerAuthenticationOptions
                {
                    AllowedAudiences = new[] { audience },
                    IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
                    {
                        new SymmetricKeyIssuerSecurityTokenProvider(issuer, secret)
                    },
                    Provider = new CookieOAuthBearerProvider("authCookie")
                });

但是此方法不適用於每個請求。

這是我們當前正在使用的代碼片段(連接到AzureAD)。 您將需要實現GetSigningCertificates ,它返回IEnumerable<X509SecurityToken>來驗證JWT是否正確簽名。

internal static ClaimsPrincipal GetClaimPrincipalFromToken(string jwtSecurityHeader)
{
    var jwtSecurityHandler = new JwtSecurityTokenHandler();

    var signingCertificates = GetSigningCertificates(ConfigHelper.FederationMetadataDocument);
    var tokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidAudience = ConfigHelper.AppIdURI,
        ValidIssuer = ConfigHelper.Issuer,
        LifetimeValidator =
            (before, expires, token, parameters) =>
            {
                //Don't allow not-yet-active tokens
                if (before.HasValue && before.Value > DateTime.Now)
                    return false;

                //If expiration has a date, add 2 days to it
                if (expires.HasValue)
                    return expires.Value.AddDays(2) > DateTime.Now;

                //Otherwise the token is valid
                return true;
            },
        ValidateLifetime = true,
        IssuerSigningTokens = signingCertificates,
    };

    var headerParts = jwtSecurityHeader.Split(' ');
    if (headerParts.Length != 2 || headerParts[0] != "Bearer")
        throw new AuthorizationException(HttpStatusCode.Forbidden, "Invalid token type");

    var jwtSecurityToken = headerParts[1];
    SecurityToken jwtToken;
    var claimsPrincipal = jwtSecurityHandler.ValidateToken(jwtSecurityToken, tokenValidationParameters, out jwtToken);

    return claimsPrincipal;
}

您需要針對您的應用程序對其進行一些調整,但這應該可以幫助您實現大部分目標。 請注意,此代碼正在解析{HeaderType} {Token}格式(例如Bearer {token} )。 如果只是解析{Token} ,則需要刪除.Split(' ')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM