2017-10-15 2 views
1

Ich versuche, ein externes Login-Schema für Facebook, Google und Linkedin ohne Verwendung von Identitäts-Framework zu erstellen. Ich habe eine API, die alle Benutzer speichert und einige Authentifizierungstools durchführt. Im Moment bin ich irgendwie verloren, wie ich die Informationen vom externen Login bekommen kann.Externe Anmeldung ohne Verwendung der Identität asp.net core 2.0

Ich stelle eine Herausforderung wie diese.

[HttpPost] 
[ValidateAntiForgeryToken] 
public IActionResult ExternalLogin(string provider) 
{ 
    //Issue a challenge to external login middleware to trigger sign in process 
    return new ChallengeResult(provider); 
} 

Das funktioniert gut, es leitet mich zu Google, Facebook oder Linkedinn-Authentifizierung.

nun auf diesem Teil:

public async Task<IActionResult> ExternalLoginCallback() 
{ 
    //Extract info from externa; login 

    return Redirect("/"); 
} 

Alles, was ich will, ist die Information zu erhalten, die durch die externe Login zur Verfügung gestellt wurde.

ich versucht habe, was ich aus meiner Forschung gefunden,

var result = await HttpContext.AuthenticateAsync(provider); 
if (result?.Succeeded != true) 
{ 
    return Redirect("/"); 
} 
var externalUser = result.Principal; 
var claims = externalUser.Claims.ToList(); 

Zunächst einmal ich ich bin nicht sicher, ob eine einfache ?provider=Google auf meinem Rückruf String wird die Provider-Namen gebe ich angeben, so kann es verwendet werden um das Anmeldeverfahren zu überprüfen. Ich denke, das ist falsch. Zweitens habe ich versucht, Codieren await HttpContext.AuthenticateAsync("Google") und wenn es diesen Code erreichen, stoppt das Debuggen. Ich bin mir nicht sicher warum.

Ich habe den generierten Code beim Erstellen eines Projekts mit Einzelauthentifizierung gesehen.

var info = await _signInManager.GetExternalLoginInfoAsync(); 

Leider bin ich Identität nicht nutzen können, da ich eine API keinen Benutzerspeicher und meine Anwendung haben verbrauchen.

+0

Hey hast du jemals eine Lösung finden? Kann keine Dokumentation oder Beispiele dafür finden, wie Sie dies ohne asp.net Identität tun können ... :( – Reft

Antwort

2

Zuerst müssen Sie einen benutzerdefinierten Cookie-Handler erstellen. Ich selbst hatte Probleme mit:

No IAuthenticationSignInHandler is configured to handle sign in for the scheme: Bearer

Ich musste einen Cookie-Handler hinzufügen, der das Ergebnis der externen Authentifizierung, z. die Ansprüche, die vom externen Anbieter gesendet wurden. Dies ist erforderlich, da normalerweise einige Weiterleitungen erforderlich sind, bis Sie mit dem externen Authentifizierungsprozess fertig sind.

Startup

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(o => 
{ 
    o.TokenValidationParameters = tokenValidationParameters; 
}) 
.AddCookie("YourCustomScheme") 
.AddGoogle(googleOptions => 
{ 
    googleOptions.SignInScheme = "YourCustomScheme"; 
    googleOptions.ClientId = "x";//Configuration["Authentication:Google:ClientId"]; 
    googleOptions.ClientSecret = "x";//Configuration["Authentication:Google:ClientSecret"]; 
    //googleOptions.CallbackPath = "/api/authentication/externalauthentication/signin-google"; 
}); 

Der wichtigste Teil ist hier "YourCustomScheme".

Jetzt ist es an der Zeit, die Benutzerinformationen aus den von der externen Authentifizierung in der Callback-Aktion bereitgestellten Anträgen abzurufen.

-Controller

[AllowAnonymous] 
[HttpPost(nameof(ExternalLogin))] 
public IActionResult ExternalLogin(ExternalLoginModel model) 
{ 
    if (model == null || !ModelState.IsValid) 
    { 
     return null; 
    } 

    var properties = new AuthenticationProperties { RedirectUri = _authenticationAppSettings.External.RedirectUri }; 

    return Challenge(properties, model.Provider); 
} 

[AllowAnonymous] 
[HttpGet(nameof(ExternalLoginCallback))] 
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null) 
{ 
    //Here we can retrieve the claims 
    var result = await HttpContext.AuthenticateAsync("YourCustomScheme"); 

    return null; 
} 

Voilà! Wir haben jetzt einige Benutzerinformationen, mit denen wir arbeiten können!

enter image description here

Hilfreiche Link

http://docs.identityserver.io/en/release/topics/signin_external_providers.html

+0

Hallo, ich habe was getan was du getan hast und ich habe es gestern getan, aber eine Weile nachdem ich immer eine bekommen habe Fehler: "Ausnahme: OAuth Token Endpunkt Fehler: Status: BadRequest; Header: Cache-Control: no-store". Wenn ich debuggen geht es zu einer Methode wie die, die ljpv14 im Hauptbeitrag gezeigt hat, ExternalLogin. Das ist richtig nachdem ich neues ChallengeResult ("Facebook") zurückgegeben habe, geht es einfach in eine Schleife. Warum passiert das? – taiko

+0

Wenn ich die Zeile "var result = await HttpContext.AuthenticateAsync (" YourCustomScheme ");" in der Methode, wird es die Info auf der zweiten gehen, aber immer noch auf einer Schleife.Und ich weiß nicht warum. – taiko

+0

Haben Sie beide Aktionen, ExternalLogIn und ExternalLoginCallback? Sie sollten Herausforderung in der ersten zurückgeben und die Daten in der zweiten, (mit httpcontext.authenticateasync) Es tut mir leid, ich habe nicht ex erlebte diese Probleme, lass uns sehen, was Ljpv14 sagt und wenn er die gleichen Probleme hat, kann er vielleicht etwas Code zur Verfügung stellen. Auch dieser Link könnte Ihnen ein besseres Verständnis dafür geben, wie es funktioniert, hat es für mich getan. http://docs.identityserver.io/en/release/topics/signin_external_providers.html – Reft

-2

Ich hatte auch dieses Problem und sehen, ob der folgende Code für Sie funktioniert. Ich wollte den vollständigen Namen nach Google/FB-Authentifizierung extrahieren.

var info = await _signInManager.GetExternalLoginInfoAsync(); 

TempData["fullname"] = info.Principal.FindFirstValue(ClaimTypes.Name); 
Verwandte Themen