2016-08-03 17 views
11

Ich bin über ein Problem gestolpert, wo die Anwendung den Benutzer auf Account/AccessDenied/ umleitet, wenn dem angemeldeten Benutzer eine Social Media-Authentifizierung hinzugefügt wird. Es scheint zu funktionieren, wenn der Benutzer zum ersten Mal angemeldet ist. Wenn Sie dann versuchen, eine weitere Authentifizierungsmethode hinzuzufügen, wird der Benutzer an Account/AccessDenied?ReturnUrl=%2Fmanage%2Flinklogincallback zurückgegeben.App verweist auf Account/AccessDenied beim Hinzufügen von Oauth

Meine Vermutung ist, dass etwas mit dem Attribut [Autorisieren] schief geht, aber nur das zweite Mal versuche ich externe Authentifizierungsmethode hinzuzufügen.

ManageController

[Authorize] 
public class ManageController : Controller 
{ 
    // 
    // POST: /Manage/LinkLogin 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public IActionResult LinkLogin(string provider) 
    { 
     // Request a redirect to the external login provider to link a login for the current user 
     var redirectUrl = Url.Action("LinkLoginCallback", "Manage"); 
     var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl, _userManager.GetUserId(User)); 
     return Challenge(properties, provider); 
    } 

    // 
    // GET: /Manage/LinkLoginCallback 
    [HttpGet] 
    public async Task<ActionResult> LinkLoginCallback() 
    { 
     var user = await GetCurrentUserAsync(); 
     if (user == null) 
     { 
      return View("Error"); 
     } 
     var info = await _signInManager.GetExternalLoginInfoAsync(await _userManager.GetUserIdAsync(user)); 
     if (info == null) 
     { 
      return RedirectToAction(nameof(ManageLogins), new { Message = ManageMessageId.Error }); 
     } 
     var result = await _userManager.AddLoginAsync(user, info); 
     var message = result.Succeeded ? ManageMessageId.AddLoginSuccess : ManageMessageId.Error; 
     return RedirectToAction(nameof(ManageLogins), new { Message = message }); 
    } 
} 

Könnte es die Reihenfolge, in der startup.cs sein angeordnet ist?

Dies ist das Request/Response

enter image description here

+0

Tritt dieser Fehler regelmäßig auf? Weil ich diesen Fehler sehr oft bekam, als mein Code noch Buggy-Ausnahmen warf. Durch das Löschen der Cookies wurde das Problem vorübergehend behoben. Später, als ich meine kleinen Fehler korrigierte, trat diese Umleitung nicht mehr auf. –

+0

Es passiert ständig, aber ich habe keine Ahnung, was es ist, da alles andere wie geplant funktioniert. Was waren deine kleinen Fehler, die du behoben hast, damit es funktioniert? – Rovdjuret

+0

Haben Sie 'app.UseGoogleAuthentication (...)' in Ihrer 'Configure() 'Methode der' Startup'-Klasse hinzugefügt? –

Antwort

3

ich von aspnet Team bestätigt haben auf Sicherheits Repo arbeiten, dies ein Fehler ist (diese issue sehen) und bis zum nächsten Release behoben. Eine vorübergehende Lösung ist einen Cookie

Identity.External

auf null, mit dem Namen zu setzen, die nach Zugabe von externer Login auf Ihr Konto erstellt wird.

if (Request.Cookies["Identity.External"] != null) 
{ 
    Response.Cookies.Delete("Identity.External"); 
} 
+2

Können Sie den Link zum GitHub-Problem bitte posten? –

+0

Aktualisierte Antwort mit Link, @GerardoGrignoli – Rovdjuret

+0

Ich war auch das Problem, aber nachdem ich auf 1.1.0 aktualisiert, funktioniert es auch ohne die Problemumgehung – Liero

6

@ Rovdjuret Workaround half mir, bis es von asp.net Team gelöst wird. Hier ist mein Controller Login-Aktion:

public IActionResult Login(string returnUrl = null) 
{ 
    if (_signInManager.IsSignedIn(User)) 
    { 
     // redirect to user profile page 
     return RedirectToAction(nameof(HomeFileController.Index), "HomeFile");     
    } 
    else 
    { 
     // clear Identity.External cookie 
     if (Request.Cookies["Identity.External"] != null) 
     { 
      Response.Cookies.Delete("Identity.External"); 
     } 
     return View(new LoginViewModel{ ReturnUrl = returnUrl, RememberMe = true }); 
    } 
} 

Update: In der neuesten Version (Stand Mai 2017) die Cookies Präfix ".AspNetCore.". So sollte Cookie-Name sein ".AspNetCore.Identity.External"

5

Ich auch das gleiche Problem konfrontiert. Ich war mit dem Code aus IdentityServer4 Quick-Beispiel von here

 app.UseGoogleAuthentication(new GoogleOptions 
     { 
      AuthenticationScheme = "Google", 
      DisplayName = "Google", 
      SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme, 

      ClientId = "xxx.apps.googleusercontent.com", 
      ClientSecret = "xxxx-Xxxxxxx" 
     }); 

Ich hatte den Code den folgenden ändern, um das Problem zu beheben.

 var CookieScheme= app.ApplicationServices.GetRequiredService<IOptions<IdentityOptions>>().Value.Cookies.ExternalCookieAuthenticationScheme; 

     app.UseGoogleAuthentication(new GoogleOptions 
     { 
      AuthenticationScheme = "Google", 
      DisplayName = "Google", 
      SignInScheme = CookieScheme, 

      ClientId = "xxx.apps.googleusercontent.com", 
      ClientSecret = "xxxx-Xxxxxxx" 
     }); 

Anstatt nur die Konstante ‚externen‘ mit von der IdentityServerConstants.ExternalAUthenticationScheme ich das Schema erhalten musste benutzt, um externe Authentifizierungscookies von den Cookie-Optionen des aktuellen Identitätssystem von der App verwendet zu identifizieren. Das hat das Problem für mich behoben.

+0

Danke für die Info, gut zu wissen, wie ich gerade IDS4 implementiere :) – Rovdjuret

3

Abhilfe half mir, bis es von asp.net Team aufgelöst hat

// GET: /Account/AccessDenied 
    [HttpGet] 
    [AllowAnonymous] 
    public IActionResult AccessDenied(string returnUrl = null) 
    { 
     // workaround 
     if (Request.Cookies["Identity.External"] != null) 
     { 
      return RedirectToAction(nameof(ExternalLoginCallback), returnUrl); 
     } 
     return RedirectToAction(nameof(Login)); 

    } 
2

Wenn Sie config.SignIn.RequireConfirmedEmail = true in Startup.cs festgelegt haben und die EmailConfirmed Feld ist false für einen extern authentifizierten Benutzer (zB Facebook-Login), auf nachfolgenden Anmeldungen Sie werden zur Aktionsmethode Account/AccessDenied/ weitergeleitet.

+0

Ich habe das 'EmailConfirmed' auf' true' gesetzt, da es für die externe Anmeldung sinnvoll ist und nicht hilft – Sergey