序列包含多个元素 Microsoft.Owin.Security.AuthenticationManager
Posted
技术标签:
【中文标题】序列包含多个元素 Microsoft.Owin.Security.AuthenticationManager【英文标题】:Sequence contains more than one element Microsoft.Owin.Security.AuthenticationManager 【发布时间】:2015-01-21 23:05:58 【问题描述】:在尝试使用 Google 进行外部身份验证时,应用程序给了我以下异常:
发生错误。 序列包含多个元素 System.InvalidOperationException 在 System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable1 source) at Microsoft.Owin.Security.AuthenticationManager.<AuthenticateAsync>d__8.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter
1.GetResult() at System.Web.Http.HostAuthenticationFilter.d__0.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 - -- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at System.Web.Http.Controllers .AuthenticationFilterResult.d__0.MoveNext() --- 从先前引发异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()
我的 Web Api oAuth 配置如下:
public void ConfigureOAuth(IAppBuilder app)
app.UseExternalSignInCookie(
Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);
OAuthBearerOptions = new OAuthBearerAuthenticationOptions();
OAuthAuthorizationServerOptions OAuthServerOptions =
new OAuthAuthorizationServerOptions()
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
Provider = new SimpleAuthorizationServerProvider(),
;
app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(OAuthBearerOptions);
googleAuthOptions = new GoogleOAuth2AuthenticationOptions()
ClientId = ClientId,
ClientSecret = ClientSecret,
Provider = new GoogleAuthProvider()
;
app.UseGoogleAuthentication(googleAuthOptions);
【问题讨论】:
我找到了解决方案here 它会帮助你 【参考方案1】:请检查一下,您可能会使用
app.UseOAuthBearerTokens(OAuthOptions);
和
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
一起
【讨论】:
【参考方案2】:我通过同时使用以下两个配置设置解决了这个问题(我使用的是刷新令牌):
app.UseOAuthAuthorizationServer(options);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
【讨论】:
【参考方案3】:我也遇到了这个错误,结果发现我有以下错误:
app.UseCookieAuthentication(new CookieAuthenticationOptions
AuthenticationType = DefaultAuthenticationTypes.ExternalCookie
在我的安全配置中 也可以在 Controller 上使用:
[HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)]
(为了完整起见:我只使用 web.api owin,使用 owin IIS 托管)
解决方案:删除其中一个解决了问题,所以我想添加这样的控制器属性与配置两次相同。寻找这样的可疑事物(它们也可能在您使用的库中配置!)
有关错误发生位置的更多背景信息:
在我的情况下,观察到很多次(但不总是?!)错误发生。调试得知有问题的方法存在于 Microsoft.Owin.Security.AuthenticationManager 中:
public async Task<AuthenticateResult> AuthenticateAsync(string authenticationType)
IEnumerable<AuthenticateResult> source = await this.AuthenticateAsync(new string[] authenticationType );
return source.SingleOrDefault<AuthenticateResult>(); //<== this line throws because there are two
(在我的例子中,authenticationType 是“ExternalCookie”)
【讨论】:
【参考方案4】:见WebApi OAuth UseOAuthBearerAuthentication gives "Sequence contains more than one element" error。我自己通过注释来修复它
app.UseOAuthAuthorizationServer(OAuthOptions);
相反,但我想它们不能同时拥有两者?
【讨论】:
以上是关于序列包含多个元素 Microsoft.Owin.Security.AuthenticationManager的主要内容,如果未能解决你的问题,请参考以下文章