为什么我一直在使用外部登录回调来获取此错误。这是我在做什么。
进口
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 CA
"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
我的代码中的哪一点 View a print screen
这种行为与google,twitter和facebook类似。外部认证似乎进展顺利,但回调抛出此异常。 我感谢所提出的任何建议。
答案 0 :(得分:1)
我找不到GetExternalLoginInfoAsync()
的源代码(在Microsoft.Owin.Security.AuthenticationManagerExtensions中),但反编译显示(简化):
await manager.AuthenticateAsync("ExternalCookie");
AuthenticateAsync()
的来源可用on CodePlex,您可在其中找到:
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()
错误是因为您的身份验证配置导致指定`authenticationType“的多个AuthenticateResult
条目(特别是“ExternalCookie”)。
如果你可以发布更多的Startup.cs,我们可能会发现确切的问题。