ASP.NET - OpenIdConnect - 重定向URI格式不正确

时间:2018-02-12 22:42:48

标签: .net asp.net-core asp.net-core-mvc openid-connect

当我使用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/

1 个答案:

答案 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的重定向端点。