Насколько чувствителен к изменению документ открытия Google OpenID? - PullRequest
0 голосов
/ 04 августа 2020

То, что я пытаюсь сделать

Я пытаюсь реализовать Google OpenID Connect как средство входа в систему ASP. NET Core 3.1 веб-сайт с использованием инструкций Google:

https://developers.google.com/identity/protocols/oauth2/openid-connect#server -flow

В рамках шага 2 потока сервера (отправьте запрос аутентификации в Google) они рекомендуют получать информацию из своего документа обнаружения OpenID:

Вы должны получить базовый URI из документа обнаружения , используя значение метаданных authorization_endpoint.

В настоящее время я пытаюсь динамически десериализовать JSON в Dictionary<string, string> по using Newtonsoft.Json. Но это вызывает у меня некоторые проблемы (похоже, не удается десериализовать JSON string array), и я подумываю изменить свою стратегию на создание model для документа открытия и using System.Text.Json для десериализации.

Сейчас мой вопрос:

Насколько чувствителен Документ открытия Google к изменениям, которые могут привести к тому, что мне придется обновить мой DiscoveryDocument.cs model?

Дилемма

с способ Newtonsoft.Json все еще будет работать, даже если Google решит удалить случайный ключ.

Но использование System.Text.Json для меня теперь простой выход и устраняет зависимость от библиотеки Newtonsoft, хотя Позже у меня могут возникнуть проблемы, если Google Discovery Document изменится.

1 Ответ

1 голос
/ 04 августа 2020

Я думаю, вам будет намного проще использовать NuGet-пакеты Microsoft.IdentityModel.Protocols и Microsoft.IdentityModel.Protocols.OpenIdConnect и использовать включенный парсер, который сделает все это за вас. Элементы в документе довольно стандартизированы, но не каждый поставщик предоставляет все элементы.

public class OpenIDSettings : IOpenIDSettings
{
    public string Issuer { get; }
    public string jwks_uri { get; }
    public string authorization_endpoint { get; }
    public string token_endpoint { get; }
    public string userinfo_endpoint { get; }
    public string end_session_endpoint { get; }
    public string check_session_iframe { get; }
    public string revocation_endpoint { get; }
    public string introspection_endpoint { get; }
    public string device_authorization_endpoint { get; }

    public ICollection<string> scopes_supported { get; }
    public ICollection<string> claims_supported { get; }

    public OpenIDSettings(string endpoint)
    {
        var configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(
            $"{endpoint}/.well-known/openid-configuration",
            new OpenIdConnectConfigurationRetriever());

        //If you get an exception here, then provider is not running or reachable
        var document = configurationManager.GetConfigurationAsync().Result;

        //Add the necessary code to populate the properties in this class
        Issuer = document.Issuer;
        jwks_uri = document.JwksUri;
        authorization_endpoint = document.AuthorizationEndpoint;
        token_endpoint = document.TokenEndpoint;
        userinfo_endpoint = document.UserInfoEndpoint;
        end_session_endpoint = document.EndSessionEndpoint;
        check_session_iframe = document.CheckSessionIframe;

        scopes_supported = document.ScopesSupported;
        claims_supported = document.ClaimsSupported;

        if (document.AdditionalData.ContainsKey("revocation_endpoint"))
            revocation_endpoint = (string)(document.AdditionalData["revocation_endpoint"]);
        
        if (document.AdditionalData.ContainsKey("introspection_endpoint"))
            introspection_endpoint = (string)(document.AdditionalData["introspection_endpoint"]);

        if (document.AdditionalData.ContainsKey("device_authorization_endpoint"))
            device_authorization_endpoint = (string)(document.AdditionalData["device_authorization_endpoint"]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...