序列包含多个元素 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.TaskAwaiter1.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的主要内容,如果未能解决你的问题,请参考以下文章

实体框架迁移:序列包含多个匹配元素

PetaPoco POCO 生成失败,序列包含多个匹配元素

添加 Signalr 版本 2.2.0 nuget 包会在 UAP 项目中引发错误“序列包含多个元素”

Sequence包含多个匹配元素

[Python学习]——序列——初识Python中的序列

python基础序列