0

为什么我通过外部登录回调不断收到此错误。这就是正在做的事情。

进口

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

我的AccountController.cs

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

我的 Startup.cs 类

.
.
.
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");
 .
 .
 .
 .

这是堆栈跟踪:

  [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

我的代码中的哪一点 查看打印屏幕

google、twitter 和 facebook 的这种行为是相似的。外部身份验证似乎进展顺利,但回调抛出此异常。我感谢提供的任何建议。

4

1 回答 1

1

我找不到GetExternalLoginInfoAsync()(在 Microsoft.Owin.Security.AuthenticationManagerExtensions 中)的来源,但反编译显示(简化):

await manager.AuthenticateAsync("ExternalCookie");

CodePlexAuthenticateAsync()上提供了源代码,您可以在其中找到:

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;
}

跟踪Authenticate(authenticationTypes, AuthenticateAsyncCallback, results)调用变得复杂,但最终SingleOrDefault()您看到的错误是因为您的身份验证配置导致AuthenticateResult指定的“authenticationType”(特别是“ExternalCookie”)有多个条目。

如果您可以发布更多 Startup.cs,我们可能会找到确切的问题。

于 2016-05-11T20:11:35.100 回答