4

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

它抛出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 等……奇怪……对吧?

其他一些信息:

任何帮助将不胜感激!

4

1 回答 1

4

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

  • 您已将 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.

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

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

于 2017-02-06T03:28:51.127 回答