8

Ich versuche, ASP.Net MVC 5 Google OAuth2 Authentifizierung richtig zu arbeiten.ASP.Net MVC 5 Google Authentifizierung mit Scope

Wenn ich eine GoogleOauth2AuthenticationOptions-Option ohne einen Bereich passiere, kann ich mich erfolgreich anmelden.

var googlePlusOptions = new GoogleOAuth2AuthenticationOptions 
{ 
    ClientId = googleClientId, 
    ClientSecret = googleClientSecret, 
    SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie, 
    Provider = new GoogleOAuth2AuthenticationProvider() 
    { 
     OnAuthenticated = async ctx => 
     { 
      ctx.Identity.AddClaim(new Claim("urn:tokens:googleplus:accesstoken", ctx.AccessToken)); 
     } 
    }, 
}; 

app.UseGoogleAuthentication(googlePlusOptions); 

Dann ist dieser Aufruf ein ExternalLoginInfo Objekt mit allen Eigenschaften wird wieder eingestellt

ExternalLoginInfo loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 

Als ich obwohl jeder Rahmen hinzufügen , dann kehrte ich bekommen keine Login-Infos. Es ist einfach null.

var googlePlusOptions = new GoogleOAuth2AuthenticationOptions 
{ 
    ClientId = googleClientId, 
    ClientSecret = googleClientSecret, 
    SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie, 
    Provider = new GoogleOAuth2AuthenticationProvider() 
    { 
     OnAuthenticated = async ctx => 
     { 
      ctx.Identity.AddClaim(new Claim("urn:tokens:googleplus:accesstoken", ctx.AccessToken)); 
     } 
    }, 
}; 

googlePlusOptions.Scope.Add(YouTubeService.Scope.Youtube); 

app.UseGoogleAuthentication(googlePlusOptions); 

Dann wird der Anruf externe Informationen zu erhalten nur kehrt null.

ExternalLoginInfo loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 

Im Google Entwickler-Konsole Ich habe wandten sich die folgenden APIs auf ..

  • Analytics API
  • BigQuery API
  • Google Cloud SQL
  • Google Cloud Storage
  • Google Cloud Storage JSON-API
  • Google+ API
  • Google+ Domains API
  • Identity Toolkit API
  • YouTube Analytics API
  • YouTube Data API v3

Etwas über Umfang der Optionen Hinzufügen bricht GetExternalLoginInfoAsync.

Antwort

9

Also habe ich das herausgefunden, mit viel Hilfe von http://www.beabigrockstar.com/blog/google-oauth-sign-asp-net-identity. Es stellt sich heraus, dass der integrierte Google-Authentifizierungsanbieter für MVC nur openId ist. Deshalb hat das Hinzufügen eines Oszilloskops es kaputt gemacht. Mit Fiddler konnte ich die GET-Anfrage an accounts.google.com sehen, die in der Abfragezeichenfolge "scope = openid" enthielt.

Durch Umschalten auf den GooglePlusOAuth2-Anbieter im obigen Link oder auf Nuget https://www.nuget.org/packages/Owin.Security.GooglePlus und unter Verwendung des Anbieternamens "GooglePlus" konnte ich die Bereiche erfolgreich hinzufügen und trotzdem die Anmeldeinformationen von GetExternalLoginInfoAsync abrufen.

2

Die Änderungen, die Google an ihren Authentifizierungsmechanismen vorgenommen hat, sind reflected in version 3.0.0 von Microsoft Owin Middleware. Wie Sie richtig festgestellt haben, wurde der OAuth-Endpunkt durch eine der Änderungen auf Google+ verschoben (https://www.googleapis.com/plus/v1/people/me).
So ist der Schlüssel zu:

  1. die OWIN Middleware auf Version 3.0 aktualisieren.0
  2. ermöglichen Google+ API für Ihre App in Google Developers Console
+0

Hier ist das nuget Paket: https://www.nuget.org/packages/Microsoft.Owin.Security.Google/ – Dunc

10

Wenn jemand hat immer noch Probleme mit dieser mit der neuesten Microsoft OWIN Middleware (3.0.0 +) ...


ich von Fiddler bemerkt, dass standardmäßig wird der Geltungsbereich auf accounts.google.com gesendet:

scope=openid%20profile%20email 

Wenn Sie Ihren eigenen Rahmen (n) über GoogleOAuth2AuthenticationOptions.Scope.Add (...) hinzufügen, dann wird der Umfang wird:

scope=YOUR_SCOPES_ONLY 

Daher müssen Sie die Standardbereiche zu (oder zumindest hinzuzufügen, das das Problem für mich fest):

var googlePlusOptions = new GoogleOAuth2AuthenticationOptions { 
    ... 
}; 

// default scopes 
googlePlusOptions.Scope.Add("openid"); 
googlePlusOptions.Scope.Add("profile"); 
googlePlusOptions.Scope.Add("email"); 

// additional scope(s) 
googlePlusOptions.Scope.Add("https://www.googleapis.com/auth/youtube.readonly");