OWIN OAuth2 中间件在重定向 uri 中带有 %23(# 片段)

丹尼尔·洛伦兹

我正在使用 ASP.NET OWIN/Katana OAuthAuthorizationServer 中间件并且遇到了障碍。

我有一些站点试图获取授权令牌并创建了一个/oauth/authorize端点。但是,这些请求来自 SPA (Angular),并且通常#在重定向 URL 中有一个片段 ( )。

发出请求后,它会将 设置redirect_uri为该 URL,但是 URL 编码的(因此#更改为%23)。但是,无论何时%23遇到URL,状态始终设置为400,并且我似乎无法以任何方式防止这种情况……无法覆盖任何内容,也没有Web.config保留的坏字符更改,等等。

因此,我试图用一些占位符替换它,然后重定向回自身。这工作得很好。但是,我似乎无法撤消URL更改。我需要将 # 放回 URL 并重定向到该 URL,但 OWIN 中间件完全忽略了将 URL 更改回的任何尝试......有人有任何想法吗?

海森特鲁伊特

这是RFC 6749 第 3.1.2 节强加的限制

端点 URI 不得包含片段组件。

建立在 OAuth2 规范之上的 OpenID Connect 规范(以及流行的 IdentityServer3/4)似乎没有这个限制,所以你可以切换到 OIDC 或稍微改变 OAuth2 规范:)

在 OWIN 中间件中,在OAuthAuthorizationServerHandler 中检查片段的存在

解决方法是通过用%23占位符替换表示片段并在将位置重定向标头发送到浏览器之前修补它来绕过此检查

%23要用占位符替换传入,您可以覆盖提供者MatchEndpoint方法:

internal class OAuth2AuthorizationServerProvider : OAuthAuthorizationServerProvider
{
    public override Task MatchEndpoint(OAuthMatchEndpointContext context)
    {
        if (context.Request.Path.StartsWithSegments(context.Options.AuthorizeEndpointPath)
            && context.Request.QueryString.HasValue)
        {
            context.Request.QueryString = new QueryString(
                context.Request.QueryString.Value.Replace("%23", "__fragment__"));
        }

        return base.MatchEndpoint(context);
    }
}

另一部分更棘手,因为默认情况下您似乎无法从提供程序类中执行此操作,因为redirectUri它内部保留在OAuthValidateClientRedirectUriContext 上

一个hacky方法是使用反射并RedirectUri在提供者ValidateClientRedirectUri方法中修改它

public override async Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
{
    // Test if the redirect uri is allowed, if not call context.SetError("invalid_client");

    var redirectUri = context.RedirectUri.Replace("__fragment__", "#");
    var setter = context.GetType().GetProperty(nameof(context.RedirectUri))?.GetSetMethod(true);
    setter?.Invoke(context, new[] { redirectUri });
    context.Validated(redirectUri);
}

另一种方法是向链中添加一个简单的中间件(在 OAuth2 中间件之前),它监视响应(因此在等待下一个中间件之后)并在需要的地方修补 Location 标头。这不像设置私有属性那么棘手,但现在补丁分布在 2 个不同的地方,这不太容易维护。

通过上述解决方法,重定向 URI 如下所示

https://server.com/#spa/path/123

请注意,您会将 URL 编码版本传递给授权端点 redirect_uri 参数

将导致重定向到

https://server.com/#spa/path/123&access_token=<the_access_token>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用OWIN中间件在Web Api中实现OAuth2 Authorization_Code流?

来自分类Dev

OWIN中间件中的URL重写

来自分类Dev

ASP.NET身份OWIN中间件Google OAuth2 AuthenticationManager登录不起作用

来自分类Dev

ASP.NET身份OWIN中间件Google OAuth2 AuthenticationManager登录不起作用

来自分类Dev

使用 Google OAuth2 错误重定向 Uri

来自分类Dev

具有价值的中间件重定向

来自分类Dev

Slim 3中间件重定向

来自分类Dev

快速中间件中的重定向循环

来自分类Dev

重定向Uri不能直接在OAuth2中打开Android应用-深度链接已配置

来自分类Dev

动态查询参数是否应出现在OAuth2(自动代码授予类型)的重定向URI中

来自分类Dev

通过OWIN中间件路由所有请求

来自分类Dev

我收到“此请求的授权已被拒绝。” 使用OWIN oAuth中间件(带有单独的Auth和资源服务器)时出现错误消息

来自分类Dev

OWIN中间件中的全局异常处理

来自分类Dev

如何在OWIN中删除中间件?

来自分类Dev

带有OWIN Cookie中间件的MVC 5-owinContext.Authentication.Sign in not issue the cookies

来自分类Dev

通过带有重定向和中间件的Express服务出“静态”路由

来自分类Dev

Serilog Owin 中间件

来自分类Dev

没有redirect_uri的Oauth2流

来自分类Dev

没有URI的LinkedIn Windows Phone OAuth2

来自分类Dev

为什么在使用Oauth2时需要两次指定重定向uri

来自分类Dev

Microsoft Azure-Google OAuth2重定向URI不匹配

来自分类Dev

为什么在使用Oauth2时需要两次指定重定向uri

来自分类Dev

oauth2重定向uri。将数据传递回客户端

来自分类Dev

OAuth2 如何确定重定向 uri 是否使用 tls?

来自分类Dev

Google OAuth 2-redirect_uri_mismatch错误,但API设置中的重定向URI正确

来自分类Dev

如何重新加载页面以重定向到VAADIN中的URI片段?

来自分类Dev

301在Google App Engine中的python中间件中重定向

来自分类Dev

如何将用户从 django rest 框架中的中间件重定向到登录页面?

来自分类Dev

Google OAUTH:请求中的重定向URI与注册的重定向URI不匹配

Related 相关文章

  1. 1

    如何使用OWIN中间件在Web Api中实现OAuth2 Authorization_Code流?

  2. 2

    OWIN中间件中的URL重写

  3. 3

    ASP.NET身份OWIN中间件Google OAuth2 AuthenticationManager登录不起作用

  4. 4

    ASP.NET身份OWIN中间件Google OAuth2 AuthenticationManager登录不起作用

  5. 5

    使用 Google OAuth2 错误重定向 Uri

  6. 6

    具有价值的中间件重定向

  7. 7

    Slim 3中间件重定向

  8. 8

    快速中间件中的重定向循环

  9. 9

    重定向Uri不能直接在OAuth2中打开Android应用-深度链接已配置

  10. 10

    动态查询参数是否应出现在OAuth2(自动代码授予类型)的重定向URI中

  11. 11

    通过OWIN中间件路由所有请求

  12. 12

    我收到“此请求的授权已被拒绝。” 使用OWIN oAuth中间件(带有单独的Auth和资源服务器)时出现错误消息

  13. 13

    OWIN中间件中的全局异常处理

  14. 14

    如何在OWIN中删除中间件?

  15. 15

    带有OWIN Cookie中间件的MVC 5-owinContext.Authentication.Sign in not issue the cookies

  16. 16

    通过带有重定向和中间件的Express服务出“静态”路由

  17. 17

    Serilog Owin 中间件

  18. 18

    没有redirect_uri的Oauth2流

  19. 19

    没有URI的LinkedIn Windows Phone OAuth2

  20. 20

    为什么在使用Oauth2时需要两次指定重定向uri

  21. 21

    Microsoft Azure-Google OAuth2重定向URI不匹配

  22. 22

    为什么在使用Oauth2时需要两次指定重定向uri

  23. 23

    oauth2重定向uri。将数据传递回客户端

  24. 24

    OAuth2 如何确定重定向 uri 是否使用 tls?

  25. 25

    Google OAuth 2-redirect_uri_mismatch错误,但API设置中的重定向URI正确

  26. 26

    如何重新加载页面以重定向到VAADIN中的URI片段?

  27. 27

    301在Google App Engine中的python中间件中重定向

  28. 28

    如何将用户从 django rest 框架中的中间件重定向到登录页面?

  29. 29

    Google OAUTH:请求中的重定向URI与注册的重定向URI不匹配

热门标签

归档