【问题标题】:ASP.NET - OpenIdConnect - The redirect URI is not well-formedASP.NET - OpenIdConnect - 重定向 URI 格式不正确
【发布时间】:2023-03-20 08:02:01
【问题描述】:

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

似乎,像这里一样的 punycode redirect_uri=http%3A%2F%2Fxn----7sbhbm9amwu.xn--p1ai 会很好,但我不知道我可以在哪里处理它。

此外,在这个警告之后,我在 kestrel 中发现了一个异常

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 中出现警告和 Kestrel 崩溃?

更新: 它可能有用 https://github.com/aspnet/Security/issues/1646

我还通过一些变通方法解决了一个问题 http://amilspage.com/set-identityserver4-url-behind-loadbalancer/

【问题讨论】:

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


    【解决方案1】:

    问题在于您使用的国际化域名。

    tldr; OpenID Connect 不允许 IDN 在重定向 URI 中。

    说明

    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 question 解释了如何使用它。

    OpenID Connect/OAuth 2.0 的 IDN 问题

    在 OAuth 2.0 中,您需要验证重定向 URI。因此,如果您使用的是 IDN,则需要对其进行转换并将其存储在授权服务器上。这样你就解决了一个问题,你的授权服务器会接受重定向 uri 进来。

    但授权请求的响应可能有问题。在您的客户端应用程序中,您使用的是 IDN。但是您已经注册了重定向端点的 ASCII 值以符合协议定义。当授权服务器响应时,您的客户端应用程序无法接收响应,因为没有与 ASCII 值匹配的重定向端点。

    如果您的授权服务器可以处理 punycode 转换,那么问题可以通过自定义方式解决。但如果不能,唯一的选择是使用基于 ASCII 的重定向端点。

    【讨论】:

    • 感谢您的回复!我使用 IdentityServer4。请您给我建议,那里的这种情况如何处理?
    • @LevNikolaevich 我的回答最后一部分解释了您面临的复杂情况。您正在使用对 OpenID Connect (OIDC) 无效的国际化域名 (IDN)。而且您的身份服务器不允许 IDN。这就是您收到验证错误的原因。所以你可能需要一个没有国际化的重定向端点。
    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2015-04-21
    • 2022-10-14
    • 1970-01-01
    相关资源
    最近更新 更多