Asp.net core ASP.NET核心Openiddict抛出;无法从此端点返回OpenID Connect响应;
我按照openiddict服务器示例中的说明使用来自的密码流 但是没有成功 它抛出InvalidOperationException:OpenID连接响应无法从路由/Connect/token处的该端点返回: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
返回签名(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回购上发布的问题。谢谢你的辛勤工作。令人惊叹的!