【问题标题】:ASP.NET Core Openiddict throws "An OpenID Connect response cannot be returned from this endpoint"ASP.NET Core Openiddict 抛出“无法从此端点返回 OpenID Connect 响应”
【发布时间】:2017-06-22 06:32:15
【问题描述】:

我按照 openiddict 服务器示例中的说明使用来自https://github.com/openiddict/openiddict-samples/tree/master/samples/PasswordFlow 的密码流 但没有成功。

它抛出 InvalidOperationException: An OpenID Connect response cannot be returned from this endpoint at route /connect/token

return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme);

邮递员参数:

  • 内容类型: application/x-www-form-urlencoded
  • 参数: username=..&password=...&grantType=password&scope=offline_access+profile+email

我花了一天的时间进行研究,但没有关于无法从此端点返回异常的信息。除了我之外,很多人都可以运行 openiddict 示例。

这是 Startup.cs 的一部分:

services.AddEntityFrameworkSqlite()
    .AddDbContext<MisapayContext>(options =>
    {
        options.UseOpenIddict<int>();
    });

    //....

    services.AddOpenIddict<int>()
    .AddEntityFrameworkCoreStores<MisapayContext>()
    .DisableHttpsRequirement()
    .EnableTokenEndpoint("/connect/token")
    .EnableLogoutEndpoint("/connect/logout")
    .EnableUserinfoEndpoint("/connect/userinfo")
    .UseJsonWebTokens()
    .AllowPasswordFlow()
    .AllowRefreshTokenFlow()
    .AddEphemeralSigningKey();

services.AddMvc(config =>
{
    config.Filters.Add(new ApiExceptionFilter());
}).AddJsonOptions(options =>
{
    options.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
    options.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;
});

已编辑:我认为问题是OpenIdConnectRequest,如果使用则无法绑定:

OpenIddictBuiler.AddMvcBinders()

将抛出 OpenID Connect 请求无法从 ASP.NET 上下文中检索到。`

否则,去掉它,AuthorizationController中的OpenIdConnectRequest就可以正常获取了。而且我可以获取用户名、密码grantType等请求信息……奇怪……对吧?

其他一些信息:

任何帮助将不胜感激!

【问题讨论】:

  • 你发现'return SignIn()' 抛出了这个异常?
  • 您是否还添加了ServiceConfiguration 中的services.AddIdentity 和services.AddOpenIddict().AddMvcBinders() 以及Configure 中的必要内容?
  • 我尝试从其他人的存储库中运行一些示例代码,但遗憾的是它们也无法正常工作。我在 return SignIn 中设置了断点...所以我确定这里会抛出异常。很奇怪,每个人都跑得很好,但我不行!
  • 是的,我按照 repo 页面上的说明进行操作。我也从其他来源获得代码,但无法正常工作。
  • 我在这里发现了一个类似的问题:github.com/openiddict/openiddict-core/issues/252。 Pinpoint 可能有答案 ;-)

标签: asp.net-core openiddict


【解决方案1】:

好的,这就是正在发生的事情:

  • 您已将 OpenIddict 配置为使用 /connect/token 作为令牌端点地址。
  • 您通过 Postman 发送的令牌请求指向 /connect/token/,这实际上是一个完全不同的 URL (/connect/token!= /connect/token/)。
  • 由于地址与注册的端点路径不同,OpenIddict 不处理请求,拒绝将其视为令牌请求。
  • 由于某些原因,MVC 接受处理您的 /connect/token/ 请求并调用 Exchange 操作,即使路由与请求的 URL 不匹配。
  • 由于您没有在 MVC 选项中注册 OpenIddict MVC binder,因此 MVC 使用其默认 binder 构造 OpenIdConnectRequest 对象,这允许从无效的 grantType 参数解析 OpenIdConnectRequest.GrantType 参数(它专用的 OpenIddict 活页夹不会发生)。
  • 您的令牌端点操作最终会调用 SignIn 以返回令牌响应。
  • 在后台,OpenIddict 检测到您在正常令牌请求处理之外调用了 SignIn - 因为由于路径差异,它不将请求视为令牌请求 - 并通过抛出 @ 中止此不安全操作987654333@.

我会 ping MVC 人员以确保他们知道这个错误。

编辑:经过一些研究,看起来这种行为是“设计使然”,并且是从 ASP.NET MVC 继承的。我打开a feature request in the aspnet/Mvc repository 添加了一种使用“严格比较”进行路由匹配的新方法。

【讨论】:

  • 我是在线手机,所以我稍后会检查。非常感谢!
  • @trinvh 仅供参考,因为 MVC 的行为不太可能改变,我决定更新 OpenIddict 以使用宽松的 URL 比较策略,将 /connect/token/ 同化为 /connect/token。不要犹豫,试试最新的 OpenIddict 位。
  • Bravo @pinpoint,我正在关注您在 MCV 的回购中发布的问题。感谢您的辛勤工作。太棒了!
猜你喜欢
  • 2017-03-25
  • 2018-03-10
  • 2015-03-30
  • 2021-08-16
  • 2017-11-08
  • 2020-05-08
  • 2015-10-09
  • 2017-09-17
  • 1970-01-01
相关资源
最近更新 更多