当我使用OpenIdConnect时,我在OpenIdConnectHandler(394行)中遇到问题
所以,我使用西里尔文域http://грант-лев.рф(仅举例),OpenIdConnectHandler中的重定向URI看起来不正确:
The redirect URI is not well-formed. The URI is: 'http://грант-лев.рф:5000/connect/authorize?client_id=RosgrantService&redirect_uri=http%3A%2F%2Fxn----7sbhbm9amwu.xn--p1ai%3A5002%2Fsignin-oidc&
好像,像这里一样惩罚redirect_uri=http%3A%2F%2Fxn----7sbhbm9amwu.xn--p1ai
会很好,但我不知道我能在哪里处理它。
此外,在此警告之后,我在红隼中发现了一个例外
System.InvalidOperationException: Invalid non-ASCII or control character in header: 0x0433
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.FrameHeaders.ThrowInvalidHeaderCharacter(Char ch)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.FrameHeaders.ValidateHeaderCharacters(String headerCharacters)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.FrameHeaders.ValidateHeaderCharacters(StringValues headerValues)
....
那么,我怎样才能将我的西里尔字段变为punycode以防止在OpenIdConnectHandler中发出警告和红隼?
更新 它可能很有用 https://github.com/aspnet/Security/issues/1646
此外,我通过使用一些解决方法解决了问题 http://amilspage.com/set-identityserver4-url-behind-loadbalancer/
答案 0 :(得分:1)
问题在于您使用的国际化域名。
<强> tldr; OpenID Connect不允许在重定向URI中使用IDN。
<强>解释强>
OpenID Connect构建于OAuth 2.0之上。因此,它继承了OAuth 2.0中的关键协议定义。以下是重定向端点
定义的摘录<强> 3.1.2. Redirection Endpoint 强>
重定向端点URI必须是由...定义的绝对URI RFC3986第4.3节。
根据OAuth 2.0定义,您不能使用国际化重定向端点,因为其定义基于RFC3986(如上所示)
现在这里是从RFC3986中提取关于URI中允许的字符的内容,
<强> Characters 强>
ABNF表示法根据US-ASCII编码字符集[ASCII]将其终值定义为非负整数(代码点)。因为URI是一系列字符,所以我们必须反转该关系才能理解URI语法。因此,ABNF使用的整数值必须通过 US-ASCII 映射回相应的字符,以便完成语法规则。
如果要将IDN转换为有效的ASCII,可以使用 IdnMapping 类进行映射。 This问题解释了如何使用它。
IDN for OpenID Connect / OAuth 2.0的问题
在OAuth 2.0中,您需要验证重定向URI。因此,如果您使用的是IDN,则需要转换它并将其存储在授权服务器上。这样你解决了一个问题,你授权服务器会接受重定向uri进来。
但是授权请求的响应可能会有问题。从您的客户端应用程序,您正在使用IDN。但是您已注册重定向端点的ASCII值以符合协议定义。当授权服务器响应时,您的客户端应用程序无法接收响应,因为没有与ASCII值匹配的重定向端点。
如果您的授权服务器可以处理punycode转换,那么问题可以通过自定义方式解决。但如果不能,只有选项是使用基于ASCII的重定向端点。