ASP.NET Core Openiddict 抛出“无法从此端点返回 OpenID Connect 响应”

tri*_*nvh 5 asp.net-core openiddict

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

它抛出InvalidOperationException: 无法从此端点在路由/connect/token返回 OpenID Connect 响应

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

邮递员参数:

  • 内容类型: application/x-www-form-urlencoded
  • 参数:用户名=..&密码=...&grantType=密码&范围=offline_access+个人资料+电子邮件

我花了一天时间进行研究,但没有关于无法从此端点异常返回的信息。除了我之外,很多人都可以运行 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;
});
Run Code Online (Sandbox Code Playgroud)

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

OpenIddictBuiler.AddMvcBinders()

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

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

其他一些信息:

任何帮助将不胜感激!

Kév*_*let 6

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

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

我将联系 MVC 人员以确保他们意识到这个错误。

编辑:经过一些研究,看起来这种行为是“设计使然”并且是从 ASP.NET MVC 继承的。我在 aspnet/Mvc 存储库中打开了一个功能请求,以添加一种使用“严格比较”进行路由匹配的新方法。

  • @trinvh FYI,由于 MVC 的行为不太可能改变,我决定更新 OpenIddict 以使用宽松的 URL 比较策略,将 `/connect/token/` 同化为 `/connect/token`。不要犹豫,尝试一下最新的 OpenIddict。 (2认同)