c# - .Net 核心 2.2 未将 302 的状态代码更新为 401。OnRedirectToL

我正在使用 identityserver4 并且我有以下 startup.cs 文件。

当出现 302 状态码时,我需要返回状态码 401。但似乎 OnRedirectToLogin 事件根本没有触发(事件中没有触发调试点)。

这段代码有什么问题或我遗漏了什么。我正在使用 .net 核心 2.2.1。

它编译成功并运行。但响应状态没有改变。

using Clients;
using IdentityModel;
using IdentityModel.AspNetCore;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Threading.Tasks;
using VueCliMiddleware;

namespace sampleapp
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc(o =>
            {
                var policy = new AuthorizationPolicyBuilder()
                     .RequireAuthenticatedUser()
                     .Build();
                o.Filters.Add(new AuthorizeFilter(policy));
            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            services.AddSpaStaticFiles(configuration =>
            {
                configuration.RootPath = "ClientApp/dist";
            });

            #region Source: https://github.com/IdentityServer/IdentityServer4.Samples/blob/master/Clients/src/MvcHybridAutomaticRefresh/Startup.cs

            services.AddAuthentication(options =>
             {
                 options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                 options.DefaultChallengeScheme = "oidc";
             })
             .AddCookie(options =>
             {
                 options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
                 options.Cookie.Name = "mvchybridautorefresh";

                 //*****Following is not working. *****
                 //*****Following is not working. *****
                 //*****Following is not working. *****
                 options.Events.OnRedirectToLogin = context =>
                 {
                     if (IsAjaxRequest(context.Request))
                     {
                         context.Response.Headers["Location"] = context.RedirectUri;
                         context.Response.StatusCode = 401;
                     }
                     else
                     {
                         context.Response.Redirect(context.RedirectUri);
                     }
                     return Task.CompletedTask;
                 };
                 //*****Above is not working. *****
                 //*****Above is not working. *****
                 //*****Above is not working. *****
             })
             .AddAutomaticTokenManagement()
             .AddOpenIdConnect("oidc", options =>
             {
                 options.Authority = Constants.Authority;
                 options.RequireHttpsMetadata = false;

                 options.ClientSecret = "secret";
                 options.ClientId = "mvc.hybrid.autorefresh";

                 options.ResponseType = "code id_token";

                 options.Scope.Clear();
                 options.Scope.Add("openid");
                 options.Scope.Add("profile");
                 options.Scope.Add("email");
                 options.Scope.Add("api1");
                 options.Scope.Add("offline_access");

                 options.ClaimActions.MapAllExcept("iss", "nbf", "exp", "aud", "nonce", "iat", "c_hash");

                 options.GetClaimsFromUserInfoEndpoint = true;
                 options.SaveTokens = true;

                 options.TokenValidationParameters = new TokenValidationParameters
                 {
                     NameClaimType = JwtClaimTypes.Name,
                     RoleClaimType = JwtClaimTypes.Role,
                 };

             });

            #endregion

        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseSpaStaticFiles();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller}/{action=Index}/{id?}");
            });

            app.UseSpa(spa =>
            {
                spa.Options.SourcePath = "ClientApp";

                if (env.IsDevelopment())
                {
                    spa.Options.StartupTimeout = new TimeSpan(0, 0, 360);
                    spa.UseVueCli(npmScript: "serve", port: 8080);
                }
            });
        }

        private static bool IsAjaxRequest(HttpRequest request)
        {
            return string.Equals(request.Query["X-Requested-With"], "XMLHttpRequest", StringComparison.Ordinal) ||
                string.Equals(request.Headers["X-Requested-With"], "XMLHttpRequest", StringComparison.Ordinal);
        }

    }
}

最佳答案

    .AddCookie(options =>
         {
             options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
             options.Cookie.Name = "mvchybridautorefresh";

              options.LoginPath = new PathString("/Account/Login"); //please provide your login/logout path
              options.LogoutPath = new PathString("/Account/Logout");

             options.Events.OnRedirectToLogin = context =>
             {
                 if (IsAjaxRequest(context.Request))
                 {
                     context.Response.Headers["Location"] = context.RedirectUri;
                     context.Response.StatusCode = 401;
                 }
                 else
                 {
                     context.Response.Redirect(context.RedirectUri);
                 }
                 return Task.CompletedTask;
             };

         })

关于c# - .Net 核心 2.2 未将 302 的状态代码更新为 401。OnRedirectToLogin 事件未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54560707/

相关文章:

python - Jupyter Notebook 定制服务

python - 有没有办法让 git commit --verbose 在使用预提交 Hook 时

model-view-controller - ErroCS1929 'IHtmlHelper

python - 如何使用 python 比较一张图像和许多其他图像之间的 SSIM?

spring-boot - 我无法在 spring boot 中从 yaml 注入(inject)

r - 如何用 RHS 上的矩阵项理解/扩展 r 公式

spring - @Transactional 具有多个事务管理器和多个数据库

asp.net-core - 在 Asp.net Core Identity 2.1x 中扩展 Us

c# - 远程端身份验证失败(流可能仍可用于其他身份验证尝试)

reactjs - 模拟 ('change' 之后状态未更新