0

Warum bekomme ich diesen Fehler mit externem Login-Callback. Hier ist was ich mache.Mvc5 ExternalLoginCallback: "await AuthenticationManager.GetExternalLoginInfoAsync()" schlägt fehl mit "Sequenz enthält mehr als ein Element"

Importe

using Microsoft.Owin.Security.MicrosoftAccount; 
using Microsoft.Owin.Security; 

Mein AccountController.cs Klasse

.  
. 
. 
. 
. 
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 
if (loginInfo == null) 
{      
    return RedirectToAction("Login", new { returnUrl = returnUrl}); 
} 
. 
. 
. 
. 

Meine Startup.cs Klasse

. 
. 
. 
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 


     app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5)); 
     // 
     app.UseExternalSignInCookie(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie); 
. 
. 
//https://account.live.com/developers/applications/ 
     // 
     microsoftAuthOptions = new MicrosoftAccountAuthenticationOptions() 
     { 
      ClientId = "xxxxxxx", 
      ClientSecret = "xxxxxxx", 
      CallbackPath = new PathString("/callbacks/microsoft"), 
      Provider = new MicrosoftAccountAuthenticationProvider() 
      { 
       OnAuthenticated = (context) => 
       { 
        context.Identity.AddClaim(new System.Security.Claims.Claim("MicrosoftAccountAccessToken", context.AccessToken)); 

        return Task.FromResult(0); 
       } 
      } 
     }; 
     app.UseMicrosoftAccountAuthentication(microsoftAuthOptions); 

     // 
     twitterAuthOptions = new TwitterAuthenticationOptions() 
     { 
      ConsumerKey = "xxxxxxxx", 
      ConsumerSecret = "xxxxxxx", 
      CallbackPath = new PathString("/callbacks/twitter"), 
      Provider = new TwitterAuthenticationProvider() 
      { 
       OnAuthenticated = (context) => 
       { 
        context.Identity.AddClaim(new System.Security.Claims.Claim("TwitterAccessToken", context.AccessToken)); 

        return Task.FromResult(0); 
       } 
      }, 
      BackchannelCertificateValidator = new CertificateSubjectKeyIdentifierValidator(new[] 
       { 
        "A5EF0B11CEC04103A34A659048B21CE0572D7D47", // VeriSign Class 3 Secure Server CA - G2 
        "0D445C165344C1827E1D20AB25F40163D8BE79A5", // VeriSign Class 3 Secure Server CA - G3 
        "7FD365A7C2DDECBBF03009F34339FA02AF333133", // VeriSign Class 3 Public Primary Certification Authority - G5 
        "39A55D933676616E73A761DFA16A7E59CDE66FAD", // Symantec Class 3 Secure Server CA - G4 
        "5168FF90AF0207753CCCD9656462A212B859723B", //DigiCert SHA2 High Assurance Server C‎A 
        "B13EC36903F8BF4701D498261A0802EF63642BC3" //DigiCert High Assurance EV Root CA 
       }) 
     }; 
     app.UseTwitterAuthentication(twitterAuthOptions); 

     //Configure Facebook External Login 
     facebookAuthOptions = new FacebookAuthenticationOptions() { 
      AppId = "xxxxxxxx", 
      AppSecret = "xxxxxxxx", 
      CallbackPath = new PathString("/callbacks/facebook"), 
      Provider = new FacebookAuthProvider() 
      { 
       OnAuthenticated = (context) => 
       { 
        context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken)); 

        foreach (var claim in context.User) 
        { 
         var claimType = string.Format("urn:facebook:{0}", claim.Key); 
         var claimValue = claim.Value.ToString(); 

         if (!context.Identity.HasClaim(claimType, claimValue)) 
          context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, "XmlSchemaString", "Facebook")); 
        } 

        return Task.FromResult(0); 
       } 
      } 
     }; 
     facebookAuthOptions.Scope.Add("email"); 
     facebookAuthOptions.Scope.Add("user_about_me"); 
     facebookAuthOptions.Scope.Add("user_photos"); 
     facebookAuthOptions.Scope.Add("user_location"); 
. 
. 
. 
. 

ist die Stack-Trace:

[InvalidOperationException: Sequence contains more than one element] 
    System.Linq.Enumerable.SingleOrDefault(IEnumerable`1 source) +305 
    Microsoft.Owin.Security.<AuthenticateAsync>d__8.MoveNext() +213 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
    Microsoft.Owin.Security.<GetExternalLoginInfoAsync>d__a.MoveNext() +189 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
    System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +28 
    com.hwr.Controllers.<ExternalLoginCallback>d__37.MoveNext() in C:\Users\Bourne Koloh\Documents\Visual Studio 2015\Projects\com.hwr\com.hwr.mvc5\Controllers\AccountController.cs:804 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 

Welche View a print screen

Dieses Verhalten ähnlich wie in meinem Code hier zeigen ist für Google, Twitter und Facebook. Die externen Authentifizierungen scheinen gut zu laufen, aber der Callback löst diese Ausnahme aus. Ich freue mich über Vorschläge.

+0

Was ist der Stack-Trace? – SLaks

+0

@SLaks dort hast du es. Ich habe nur den relevanten Teil hinzugefügt –

Antwort

1

Ich kann nicht die Quelle für GetExternalLoginInfoAsync() (in Microsoft.Owin.Security.AuthenticationManagerExtensions) finden, aber decompiling enthüllt (vereinfacht):

await manager.AuthenticateAsync("ExternalCookie"); 

Quelle für AuthenticateAsync() ist verfügbar on CodePlex, wo Sie finden:

public async Task<AuthenticateResult> AuthenticateAsync(string authenticationType) 
{ 
    return (await AuthenticateAsync(new[] { authenticationType })).SingleOrDefault(); 
} 

public async Task<IEnumerable<AuthenticateResult>> AuthenticateAsync(string[] authenticationTypes) 
{ 
    var results = new List<AuthenticateResult>(); 
    await Authenticate(authenticationTypes, AuthenticateAsyncCallback, results); 
    return results; 
} 

durch die Authenticate(authenticationTypes, AuthenticateAsyncCallback, results) Anruf Tracing wird kompliziert, aber letztlich die SingleOrDefault() Fehler Sie sehen, ist, weil Ihre Authentifizierungskonfiguration Dies führt zu mehreren Einträgen für den angegebenen "authenticationType" (speziell "ExternalCookie").

Wenn Sie mehr von Startup.cs veröffentlichen können, können wir wahrscheinlich das genaue Problem finden.

+0

Hallo Herr, danke für Ihre Antwort. Ich habe mehr Inhalte aus meiner 'startup.cs'-Datei hinzugefügt, aber es wäre besser gewesen, wenn Sie mir den zu posten- den Teil mitteilen würden. Die Datei ist ein bisschen groß. –

+1

Ist es ein Kopier-/Einfüge-Problem, oder haben Sie wirklich zwei 'UseExternalSignInCookie()' Aufrufe? – dahlbyk

+0

Oooooo! Ja ja. Danke dafür, ich habe es nicht bemerkt. Entfernen des Duplikats –

Verwandte Themen