【问题标题】:OpenIdDict - Disable redirect on "connect/authorize" for XHR requestsOpenIdDict - 为 XHR 请求禁用“连接/授权”重定向
【发布时间】:2019-01-13 16:28:18
【问题描述】:

我正在使用 openIdDict 的示例 MVC 应用程序来实现授权代码流。但是,我有一个 Angular 6 应用程序,用于用户用于授权请求的登录页面。我已经让所有有角度的东西都在工作,但是当我提交我的“连接/授权”请求时,它正在生成一个 302。302 被浏览器捕获并且正在发生重定向,但我不希望那样。我希望请求以 200 的形式出现,然后角度应用程序可以从那里控制重定向。

我想这样做的原因: 1. 我正在集成的系统需要在重定向中填充额外的查询字符串参数(状态 * 其他)。我希望我的 Angular 应用程序填充这些而不是连接/授权。 2. Angular 应用程序将在用户允许授权后但在重定向发生之前向用户提供额外的说明/信息。

我的问题是这样的: 1、openiddict生成的响应码可以改吗? 2. 我是不是偏离了轨道,让这件事变得比应该做的更难?

Startup.cs 配置

            services.AddOpenIddict()
            .AddCore(coreOptions =>
            {
                coreOptions.UseEntityFrameworkCore().UseDbContext<ApplicationDbContext>();
            })
            .AddServer(serverOptions =>
            {
                serverOptions.UseMvc();

                serverOptions.EnableAuthorizationEndpoint(oauthOptions.AuthorizePath)
                .EnableTokenEndpoint(oauthOptions.TokenPath)
                       .EnableLogoutEndpoint(oauthOptions.LogoutPath);

                serverOptions.AllowAuthorizationCodeFlow()
                       .AllowPasswordFlow()
                       .AllowRefreshTokenFlow();

                serverOptions.SetAccessTokenLifetime(new TimeSpan(0, oauthOptions.AccessTokenLifetimeMinutes, 0));
                serverOptions.SetRefreshTokenLifetime(new TimeSpan(0, oauthOptions.RefreshTokenLifetimeMinutes, 0));

                if (!oauthOptions.RequireSSL)
                {
                    serverOptions.DisableHttpsRequirement();
                }

            });

【问题讨论】:

    标签: google-oauth openiddict


    【解决方案1】:

    我决定编写自己的中间件来拦截 Identity 生成的 302 请求,并将其替换为带有 JSON 正文的 200 请求。我敢肯定这可以简化,也许我只是错过了一些大事,而且我偏离了方向。底线是这个解决方案允许某人使用 ajax 实现授权代码流。

    Startup.cs

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            //put this before any other middleware runs
            app.UseMiddleware<AuthorizeRequestMiddleware>();
            ...
        }
    

    AuthorizeRequestMiddleware

    public class AuthorizeRequestMiddleware
    {
        private readonly RequestDelegate _next;
    
        public AuthorizeRequestMiddleware(RequestDelegate next)
        {
            _next = next;
        }
    
        public async Task Invoke(HttpContext context)
        {
            context.Response.OnStarting(AuthorizeStartingHandler, state: context);
    
            // Let the middleware pipeline run
            await _next(context);
        }
    
        private Task AuthorizeStartingHandler(object context)
        {
    
            HttpContext httpContext = (HttpContext)context;
            if (httpContext.Request.Path.HasValue && httpContext.Request.Path.Value == "/connect/authorize")
            {
                httpContext.Response.StatusCode = (int)HttpStatusCode.OK;
                AuthorizationCodeResponse responseBody = new AuthorizationCodeResponse(httpContext.Response.Headers["Location"][0]);
                httpContext.Response.WriteAsync(JsonConvert.SerializeObject(responseBody));
            }
    
            return Task.CompletedTask;
        }
    }
    

    授权码响应 这是我自己的课。您可以使响应看起来像您想要的那样。

    public class AuthorizationCodeResponse
    {
        public AuthorizationCodeResponse(string redirectUri)
        {
            this.RedirectUri = redirectUri;
        }
    
        public string RedirectUri { get; set; }
    }
    

    【讨论】:

      【解决方案2】:

      只有一种情况下 OpenIddict 会透明地做到这一点:当您明确启用请求缓存时:

      services.AddOpenIddict()
          .AddCore(options =>
          {
              // ...
          })
      
          .AddServer(options =>
          {
              // ...
              options.EnableRequestCaching();
          });
      

      启用后,此功能将授权请求存储在IDistributedCache 中,并将授权请求参数替换为单个request_id 参数,用于表示请求。为此,它确实使用了 302 重定向。

      如果您不喜欢这种行为,请不要在 OpenIddict 服务器选项中调用 options.EnableRequestCaching()

      【讨论】:

      • 我目前没有调用 EnableRequestCaching。我已经用我的 startup.cs 配置更新了我的问题。
      • 那么与OpenIddict无关。您很可能使用 cookie 身份验证(例如通过 ASP.NET Core Identity),默认行为是在您尚未通过身份验证时将您重定向到登录页面(使用 302 状态代码)。
      • 是的,在我查看了正在发生的事情之后,这是正确的。现在重定向正试图将我带到我在调用连接/授权时指定的重定向 URL。有没有办法禁用它?
      • 基本上我正在尝试做与这个问题相同的事情:stackoverflow.com/questions/36688035/…
      • 您尝试使用 XHR 查询授权端点的事实让我觉得您正在做疯狂的事情 OAuth2/OpenID Connect 不是为 :D 设计的
      猜你喜欢
      • 2020-04-27
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2019-10-31
      相关资源
      最近更新 更多