Asp.net core ASP.NET核心Openiddict抛出;无法从此端点返回OpenID Connect响应;

Asp.net core ASP.NET核心Openiddict抛出;无法从此端点返回OpenID Connect响应;,asp.net-core,openiddict,Asp.net Core,Openiddict,我按照openiddict服务器示例中的说明使用来自的密码流 但是没有成功 它抛出InvalidOperationException:OpenID连接响应无法从路由/Connect/token处的该端点返回: 返回签名(ticket.Principal、ticket.Properties、ticket.AuthenticationScheme) 邮递员: 内容类型:应用程序/x-www-form-urlencoded 参数:username=…&password=…&grantType=pas

我按照openiddict服务器示例中的说明使用来自的密码流 但是没有成功

它抛出InvalidOperationException:OpenID连接响应无法从路由/Connect/token处的该端点返回:

返回签名(ticket.Principal、ticket.Properties、ticket.AuthenticationScheme)

邮递员:

  • 内容类型:应用程序/x-www-form-urlencoded
  • 参数:username=…&password=…&grantType=password&scope=offline\u访问+配置文件+电子邮件
我花了一天的时间进行研究,但没有关于无法从此端点返回的信息。除了我之外,很多人都可以运行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;
});
services.AddEntityFrameworkSqlite()
.AddDbContext(选项=>
{
options.UseOpenIddict();
});
//....
services.AddOpenIddict()
.AddEntityFrameworkCoreStores()
.DisableHttpsRequirement()
.EnableTokenEndpoint(“/connect/token”)
.EnableLogoutEndpoint(“/connect/logout”)
.EnableUserinfoEndpoint(“/connect/userinfo”)
.UseJsonWebTokens()的
.AllowPasswordFlow()
.AllowRefreshTokenFlow()
.AddEphemeralSigningKey();
services.AddMvc(配置=>
{
添加(新的ApiExceptionFilter());
}).AddJsonOptions(选项=>
{
options.SerializerSettings.Formatting=Newtonsoft.Json.Formatting.Indented;
options.SerializerSettings.DateTimeZoneHandling=Newtonsoft.Json.DateTimeZoneHandling.Local;
});
已编辑:我认为问题在于OpenIdConnectRequest,如果使用以下内容,则无法绑定:

OpenIddictBuiler.AddMvcBinders()

将抛出无法从ASP.NET上下文检索的OpenID连接请求`

否则,删除它,AuthorizationController中的OpenIdConnectRequest就可以正确获取。我可以获得请求信息,如用户名、密码授权类型等。。。奇怪。。。对吧?

其他一些信息:

  • Asp.net核心SDK 1.1
  • Project.json:
  • Startup.cs:
  • AuthorizationController.cs:

任何帮助都将不胜感激

好的,下面是发生的事情:

  • 您已将OpenIddict配置为使用
    /connect/token
    作为令牌端点地址
  • 通过邮递员发送的令牌请求指向
    /connect/token/
    ,这实际上是一个完全不同的URL(
    /connect/token
    !=
    /connect/token/
  • 由于地址与注册端点路径不同,OpenIDICT不处理请求,拒绝将其视为令牌请求。
  • 出于某些原因,MVC接受处理您的
    /connect/token/
    请求,并调用
    交换
    操作,即使路由与请求的URL不匹配
  • 由于您尚未在MVC选项中注册OpenIddict MVC绑定器,MVC使用其默认绑定器构造
    OpenIdConnectRequest
    对象,从而允许从无效的
    GrantType
    参数解析
    OpenIdConnectRequest.GrantType
    参数(使用专用的OpenIddict活页夹不会发生这种情况)
  • 您的令牌端点操作最终调用
    SignIn
    以返回令牌响应
  • 在HUD下,OpenIDICT检测到您在正常令牌请求处理之外调用了“代码>信号IN /代码> -因为它没有考虑请求作为令牌请求,因为路径不同-通过抛出<代码>无效操作异常> /代码>中止该不安全操作。
我将ping MVC人员,以确保他们知道这个bug


编辑:经过一些研究,看起来这种行为是“设计的”,是从ASP.NET MVC继承而来的。我打开它是为了添加一种新的方法来使用“严格比较”进行路由匹配。

您发现“return SignIn()”引发此异常?您是否也添加了services.AddIdentity和services.AddOpenIddict().AddMvcBinders()在ServiceConfiguration和Configure中的必要内容中?我尝试运行来自其他repo的一些示例代码,但遗憾的是它们也不起作用。我将断点放在return sign中…所以我确定异常会在这里抛出。非常奇怪,每个人都运行良好,但不是我!是的,我遵循了repo页面上的说明。我从其他来源获得了代码o但不起作用。我在这里发现了一个类似的问题:。Pinpoint可能有答案;-)我是在线移动的,所以我稍后会检查这个问题。非常感谢你@trinvh供您参考,因为MVC的行为不太可能改变,所以我决定更新OpenIddict以使用一个宽松的URL比较策略,该策略将
/connect/token/
同化为
/connect/token
。请不要犹豫,尝试一下最新的OpenIddict比特。Bravo@pinpoint,我正在关注您在MCV回购上发布的问题。谢谢你的辛勤工作。令人惊叹的!