gpt4 book ai didi

asp.net-core - ASP.NET Core Openiddict 抛出 "An OpenID Connect response cannot be returned from this endpoint"

转载 作者:行者123 更新时间:2023-12-04 02:07:26 32 4
gpt4 key购买 nike

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

它抛出 InvalidOperationException:无法从此端点返回 OpenID Connect 响应 在路线 /连接/ token :
return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme);
postman 参数:

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

  • 我花了一天的时间进行研究,但没有关于 的信息无法从此端点返回 异常(exception)。除了我之外,很多人都可以运行 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 ,如果使用它不能被绑定(bind):
    OpenIddictBuiler.AddMvcBinders()
    将抛出 OpenID Connect 请求无法从 ASP.NET 上下文中检索到。`

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

    其他一些信息:
  • Asp.net 核心 SDK 1.1
  • 项目.json:https://gist.github.com/trinvh/47f29468887c209716098bc4c76181a7
  • 启动.cs:https://gist.github.com/trinvh/75b7a12fbee754d0ea8cf251f2da9fe9
  • AuthorizationController.cs: https://gist.github.com/trinvh/089015b2573cae550856631e72b81374

  • 任何帮助将不胜感激!

    最佳答案

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

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

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

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

    关于asp.net-core - ASP.NET Core Openiddict 抛出 "An OpenID Connect response cannot be returned from this endpoint",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42048770/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com