2017-11-23 2 views
0

Ich habe ASP.NET MVC-Anwendung, die Benutzer von Google-Konto über OWIN-Bibliothek authentifizieren.Authentifizieren ASP.NET MVC App mit OWIN ohne Anmeldung an Google Mail usw.

Die Benutzer werden irgendwann in der Web-App auf Host-Computer (Kunden) Computer, öffentliche Computer zur Verwaltung einiger Daten in der Web-App erwartet.

Es gibt eine Login-Schaltfläche, die Sie auf die Google-Anmeldeseite umleitet, Nutzer Benutzername und Passwort eingeben und zu dieser Web-App weitergeleitet wird. Bis jetzt ist es in Ordnung, so funktioniert OWIN normalerweise.

Es besteht ein Risiko, dass der Benutzer vergessen, die App auszuloggen und jemand die Daten aus der Web App erfasst. Dies ist ein Risiko in jeder Web-App richtig, ich muss es akzeptieren. Es besteht jedoch ein zusätzliches Risiko, dass jemand, wenn er sich abgemeldet hat, alle E-Mails von Google Mail, Google-Dokumenten und allen zugehörigen Google-Diensten erfasst.

Ich möchte die OWIN-Authentifizierung in der Art und Weise ändern, dass nachdem OWIN Benutzer auf die Google-Anmeldeseite umleitet, Google die Autorisierung an die Web-App ohne Login-Benutzer an Google Mail und alle damit verbundenen Google-Dienste im Webbrowser weitergibt.

Folgende Code auch Login in Gmail als Nebeneffekt der Web-App-Authentifizierung. Ich sehe, dass es viele Konfigurationsoptionen von OWIN gibt. Ich glaube es ist erreichbar:

public partial class Startup 
{ 
    private double _expirationTimeCookies = 30; // minutes - sliding expiration 

    public static ApplicationUserManager ApplicationUserManagerCreate(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    { 
     var userStore = new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()); 
     var tokenProvider = new DataProtectorTokenProvider<ApplicationUser>(options.DataProtectionProvider.Create("ASP.NET Identity")); 

     ApplicationUserManager manager = new ApplicationUserManager(userStore); 

     manager.EmailService = new EmailService(); 
     manager.SmsService = new SmsService(); 

     var dataProtectionProvider = options.DataProtectionProvider; 
     if (dataProtectionProvider != null) 
     { 
      manager.UserTokenProvider = tokenProvider; 
     } 

     return ApplicationUserManager.Create(tokenProvider, manager); 
    } 

    public void ConfigureAuth(IAppBuilder app) 
    {   
     app.CreatePerOwinContext(ApplicationDbContext.Create); 
     app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManagerCreate); 
     app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      ExpireTimeSpan = TimeSpan.FromMinutes(_expirationTimeCookies), 

      LoginPath = new PathString("/Account/Login"), 
      Provider = new CookieAuthenticationProvider 
      { 
       // Enables the application to validate the security stamp when the user logs in. 
       // This is a security feature which is used when you change a password or add an external login to your account. 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
        validateInterval: TimeSpan.FromMinutes(_expirationTimeCookies), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager, Helpers.IdentityExtensions.OnlineSettingsForAccount(user.Id))) 
      } 
     });      
     app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

     app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions() 
     { 
      ClientId = "xxxxxxxxxx.apps.googleusercontent.com", 
      ClientSecret = "xxxxxxx", 
      Provider = new GoogleOAuth2AuthenticationProvider() 
      {      
       OnApplyRedirect = delegate(GoogleOAuth2ApplyRedirectContext context) 
       {      
        string redirect = context.RedirectUri; 
        redirect += "&prompt=select_account"; 
        context.Response.Redirect(redirect); 
       } 
      }, 
     }); 
    } 
} 
+1

Also, um zu verdeutlichen: Ihre App läuft auf einem öffentlichen Computer, und Sie möchten verhindern, dass der nächste Benutzer GMail und andere Google-Dienste des vorherigen Benutzers öffnen kann, wenn ein Verbraucher vergisst, sich abzumelden? – CodeCaster

+0

Und wie überprüft Google diesen Nutzer, ohne dass er sich bei Google Services anmeldet? – Evk

+0

@CodeCaster Ja, genau. – qub1n

Antwort

7

Google bietet keine solche Option. Wenn Sie nach google umleiten, um das openid \ oauth token zu erhalten, wird der Benutzer immer zuerst aufgefordert, sich bei google anzumelden (falls noch nicht angemeldet), um die Identität der Benutzer zu überprüfen, und erst danach wird ein Token für Ihre Anwendung ausgegeben. Theoretisch könnte Google eine Option bieten, um Benutzernamen und Passwort zu verifizieren und Token auszugeben, ohne eine Sitzung mit Google selbst zu beginnen, aber ich sehe keinen Grund, warum sie das jemals tun würden. Den Benutzer so gut wie möglich einzuloggen ist für Google von Vorteil, und dies würde auch das Hauptziel eines solchen Authentifizierungsflusses stören, nämlich - das Passwort so selten wie möglich eingeben.

Also, nachdem Sie Ihren Token erhalten haben, ist der Benutzer auch bei Google Services angemeldet und Sie können das nicht ändern. Was Sie jedoch tun können, ist Log-out Zielperson von Google sofort nach Erhalt Token. Dafür können Sie Benutzer auf die folgende URL umleiten:

https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=https://yoursite.com; 

Dieser Benutzer aus Google-Diensten einzuloggen wird und ihn dann auf Ihre Website umleiten zurück.

Beachten Sie, dass:

  1. Während es jetzt funktioniert, ist es nicht überall dokumentiert ist (zumindest bin ich nicht bewusst, dass), so dass er aufhören könnte einige Zeit in der Zukunft zu arbeiten.

  2. Das könnte sein sehr ärgerlich für den Benutzer. Nach jeder Anmeldung bei Ihrer Website wird der Benutzer von Google abgemeldet. Ich persönlich würde nie eine Seite benutzen, die so etwas macht (nachdem ich in der Lage wäre herauszufinden, was überhaupt passiert, weil es nicht trivial ist).

So würde ich vorschlagen, diesen Ansatz nicht verwenden und stattdessen die Benutzer über Gefahren einer solchen Authentifizierung auf öffentlichen Computern anweisen (von „öffentlichen Computer“ Checkbox auf Login-Formular Einführung und Informationen zeigen, wenn es angeklickt wird), oder Zumindest - tue das nicht immer, aber nur, wenn dir der Benutzer explizit sagt, dass er sich gerade auf einem öffentlichen Computer befindet.

Verwandte Themen