Перенос Google OpenID в OpenID Connect: openid_id не совпадает

Я начал процесс перехода с Google OpenID на OpenID Connect с OAuth 2.0, следуя тому, что представлено вДокументация, Я могу успешно завершить рабочий процесс получения openid_id и sub внутри id_token из конечной точки токена, но когда я это сделаю, openid_id не соответствует существующему идентификатору, который мы имеем в нашей системе. Запретить мне сопоставлять существующего пользователя с новым идентификатором и запретить пользователю входить в наше приложение (или, возможно, ему разрешено входить в систему как кто-то другой). Идентификатор имеет правильный формат, но просто не совпадает.

Я установил параметр openid.realm для нашего существующего openid.realm, а также установил перенаправление так же, как предложено в документации. Это происходит как локально, так и в наших средах Azure. Я использую JWT.JsonWebToken для декодирования id_token, но я также убедился, что он правильно декодируется с помощью веб-декодера в Google:JWT Декодери я пришел к тому же идентификатору OpenID, который не совпадает с тем, который у нас есть для этого пользователя. Я должен также отметить, что я также попытался добавить область профиля, но это не имело никакого значения.

Мы используем DotNetOpenAuth.OpenId для нашей оригинальной системы, поэтому я не думаю, что проблема заключается в этом. Я проверил ClaimedIdentifier, который является частью ответа, и он соответствует тому, что мы сохраняем в нашей системе для openId, поэтому мы не сохраняем его неправильно.

Ниже приведено то, что мы используем для генерации Uri для запроса авторизации. В основном это модифицированная версия клиента DotNetOpenAuth.GoogleOAuth2.

protected static Uri GetServiceLoginUrl(Uri returnUrl)
    {
        var state = string.IsNullOrEmpty(returnUrl.Query) ? string.Empty : returnUrl.Query.Substring(1);

        return BuildUri(AuthorizationEndpoint, new NameValueCollection
            {
                { "response_type", "code" },
                { "client_id", AppId },
                { "scope", "openid" },
                { "prompt", "select_account"},
                { "openid.realm", CloudServiceConfiguration.GetDNSName() },
                { "redirect_uri", returnUrl.GetLeftPart(UriPartial.Path) },
                { "state", state },
            });
    }

private static Uri BuildUri(string baseUri, NameValueCollection queryParameters)
        {
            var q = HttpUtility.ParseQueryString(string.Empty);
            q.Add(queryParameters);
            var builder = new UriBuilder(baseUri) { Query = q.ToString() };
            return builder.Uri;
        }

И вот что мы используем для генерации запроса к конечной точке токена.

protected static Tuple<string, string> GetAuthTokens(Uri returnUrl, string authorizationCode)
    {
        var postData = HttpUtility.ParseQueryString(string.Empty);
        postData.Add(new NameValueCollection
            {
                { "grant_type", "authorization_code" },
                { "code", authorizationCode },
                { "client_id", AppId },
                { "client_secret", AppSecret },
                { "redirect_uri", returnUrl.GetLeftPart(UriPartial.Path) },
            });

        var webRequest = (HttpWebRequest)WebRequest.Create(TokenEndpoint);

        webRequest.Method = "POST";
        webRequest.ContentType = "application/x-www-form-urlencoded";

        using (var s = webRequest.GetRequestStream())
        using (var sw = new StreamWriter(s))
            sw.Write(postData.ToString());

        using (var webResponse = webRequest.GetResponse())
        {
            var responseStream = webResponse.GetResponseStream();
            if (responseStream == null)
                return null;

            using (var reader = new StreamReader(responseStream))
            {
                var response = reader.ReadToEnd();
                var json = JObject.Parse(response);
                var accessToken = json.Value<string>("access_token");
                var idToken = json.Value<string>("id_token");
                return new Tuple<string,string>(accessToken,idToken);
            }
        }
    }

Ответы на вопрос(1)

Ваш ответ на вопрос