Проверьте область JWT, используя предоставленные Microsoft библиотеки

У меня есть некоторый код, который работает, но я разочарован его подходом грубой силы и не могу найти лучшего решения нигде. У меня есть старое приложение, которое не может аутентифицировать токен в промежуточном программном обеспечении. Поэтому я должен сделать это с моей стороны.

Вот мой текущий код. (Это делает то, что мне нужно, чтобы я искал более стандартное решение.)

 public static bool IsTokenValid(string token, out long xid)
    {
        var authDomain = ConfigurationManager.AppSettings["IdentityServerUrl"];

        IConfigurationManager<OpenIdConnectConfiguration> configurationManager =
            new ConfigurationManager<OpenIdConnectConfiguration>($"{authDomain}/.well-known/openid-configuration",
                new OpenIdConnectConfigurationRetriever());
        if (_openIdConfig == null)
        {
            _openIdConfig =
                configurationManager.GetConfigurationAsync(CancellationToken.None).GetAwaiter().GetResult();
        }

        TokenValidationParameters validationParameters =
            new TokenValidationParameters
            {
                ValidIssuer = authDomain,
                ValidateAudience = false,
                IssuerSigningKeys = _openIdConfig.SigningKeys,
            };

        SecurityToken validatedToken;
        JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
        ClaimsPrincipal principal;
        try
        {
            principal = handler.ValidateToken(token, validationParameters, out validatedToken);
        }
        catch (Exception e)
        {
            return false;
        }

        var claims = principal.Claims;

        var scopes = claims.Where(t => t.Type == "scope");
        var requiredScope = ConfigurationManager.AppSettings["RequiredScope"];
        if (scopes.FirstOrDefault(t => t.Value == requiredScope) == null)
        {
            return false;
        }

        if( ...other validation stuff, I'm not worried about... )
        {
            return true;
        }
        return false;
    }

0 ответов

Другие вопросы по тегам