Rozpocząłem proces migracji z Google OpenID do OpenID Connect z OAuth 2.0, zgodnie z tym, co jest przedstawione w Documentation. Potrafię pomyślnie zakończyć przepływ roboczy pobierania elementu id_idid i subwewnątrz id_token z punktu końcowego tokena, ale kiedy to zrobię, id_passid nie pasuje do istniejącego identyfikatora, który mamy w naszym systemie. Zapobieganie odwzorowywaniu istniejącego użytkownika na nowy identyfikator i uniemożliwianie użytkownikowi zalogowania się do naszej aplikacji (lub być może zezwolenie na zalogowanie się jako ktoś inny). id ma poprawny format, ale po prostu nie pasuje.Migracja Google OpenID do OpenID Connect: openid_id nie pasuje do
Ustawiłem parametr openid.realm w naszym istniejącym pliku openid.realm, a także ustawienie przekierowania tak, jak sugeruje dokumentacja. Dzieje się to zarówno lokalnie, jak i na naszych lazurowych środowiskach hostingowych. Używam JWT.JsonWebToken do dekodowania identyfikatora id_token, ale również zweryfikowaliśmy, że został poprawnie zdekodowany za pomocą dekodera hostowanego w google: JWT Decoder, i wymyśliłem ten sam Identyfikator OpenID, który nie pasował do tego, który mamy obecnie dla tego użytkownika. Powinienem również zauważyć, że próbowałem również dodać zakres profilu, ale to nie miało znaczenia.
Używamy DotNetOpenAuth.OpenId dla naszego oryginalnego systemu, więc nie sądzę, że problem leży w tym miejscu. Przeanalizowałem ClaimedIdentifier, który jest częścią odpowiedzi i jest zgodny z tym, co zapisujemy w naszym systemie dla openId, więc nie zapisujemy go niepoprawnie.
Poniżej znajduje się to, czego używamy do generowania Uri dla żądania autoryzacji. Jest to głównie zmodyfikowana wersja klienta 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;
}
A oto co używamy do generowania żądania do punktu końcowego tokena.
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);
}
}
}
Korzystając z powyższego, mam problemy, w przypadku których w dodatkowych danych nie jest zwracany znacznik openid. Jak udało ci się to odzyskać? – Doug