如何配置dotnetcore 3站点以使用自定义授权过滤器返回401,而不是重定向到AccessDenied页面

问题描述 投票:0回答:1

我有一个使用新的dotnetcore3角度模板的网站。我创建了一个自定义授权过滤器,该过滤器目前非常简单

public class ClaimRequirementFilter : IAuthorizationFilter
{
    readonly string _claim;

    public ClaimRequirementFilter(string claim)
    {
        _claim = claim;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {

        if (_claim != "test")
        {
            context.Result = new ForbidResult();
        }
    }
}
public class ClaimRequirementAttribute : TypeFilterAttribute
{
    public ClaimRequirementAttribute(string claimType) : base(typeof(ClaimRequirementFilter))
    {
        Arguments = new object[] {claimType };
    }
}
    [Route("{jobId}")]
    [ClaimRequirement("testfail")]
    [HttpGet]
    public async Task<IActionResult> GetJob([FromRoute] Guid jobId)
    {
      //stuff
    {

但是,每当请求失败时(现在将是所有请求),它会将我带到试图访问的URL的returnUrl 302s带到AccessDenied页面。

但是,由于此请求是从我的有角度的客户端发出的,因此我宁愿它只返回401(或403,因为在这种情况下,这是因为登录的用户无权执行他们想做的事情) ,但不确定如何配置。

根据Ruard的要求,这是我的启动配置

public class Startup
    {
        public Startup(IWebHostEnvironment env, IConfiguration configuration)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddApplicationInsightsTelemetry();
            services.AddDbContext<ApplicationDbContext>(
              options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))
            );

            services.AddTransient<EmailSender, EmailSender>();
            services.AddScoped<IRazorViewToStringRenderer, RazorViewToStringRenderer>();
            services.Configure<EmailServiceConfiguration>(Configuration.GetSection("EmailServiceConfiguration"));
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

            services.AddIdentity<ApplicationUser, IdentityRole>()
                    .AddDefaultTokenProviders()
                    .AddEntityFrameworkStores<ApplicationDbContext>();

            services.AddIdentityServer(options =>
                    {
                        options.UserInteraction.LoginUrl = "/auth/login";
                        options.UserInteraction.LogoutUrl = "/auth/logout";
                    })
                    //.AddDeveloperSigningCredential()
                    .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();


            services.AddAuthentication()
                    // .AddGoogle(options =>
                    //   {
                    //     IConfigurationSection googleAuthNSection = Configuration.GetSection("Authentication:Google");
                    //     options.ClientId = googleAuthNSection["ClientId"];
                    //     options.ClientSecret = googleAuthNSection["ClientSecret"];
                    //   })
                    .AddIdentityServerJwt();


            services.AddControllersWithViews().AddRazorRuntimeCompilation();

            services.AddRazorPages(options =>
            {
                options.Conventions.AddAreaPageRoute("Identity", "/Identity/Account/Login", "/auth/login");
            });


            services.AddAuthorization(options =>
            {
                // options.AddPolicy("RequireAdmin", policy =>
                // {
                //   policy.RequireRole("Admin");
                // });

                // options.AddPolicy("CreateInternalUsers", policy =>
                // {
                //   // policy.RequireRole("Admin");
                //   policy.RequireClaim("CreatePPGUser");
                // });
            });

            // In production, the Angular files will be served from this directory
            services.AddSpaStaticFiles(configuration =>
            {
                configuration.RootPath = "ClientApp/dist";
            });
            services.AddControllers()
              .AddNewtonsoftJson(options =>
              {
                  options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
              });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ApplicationDbContext context, IServiceProvider services)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
            context.Database.Migrate();
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            if (!env.IsDevelopment())
            {
                app.UseSpaStaticFiles();
            }

            app.UseRouting();

            app.UseAuthentication();
            app.UseIdentityServer();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller}/{action=Index}/{id?}"
                  );

                endpoints.MapRazorPages();
            });

            app.UseSpa(spa =>
            {
                // To learn more about options for serving an Angular SPA from ASP.NET Core,
                // see https://go.microsoft.com/fwlink/?linkid=864501

                spa.Options.SourcePath = "ClientApp";

                if (env.IsDevelopment())
                {
                    // spa.UseAngularCliServer(npmScript: "start");
                    spa.UseProxyToSpaDevelopmentServer("http://localhost:4200");
                }
            });

            CreateUserRoles(services).Wait();
        }
}
asp.net-core asp.net-identity identityserver4
1个回答
0
投票

您应该添加一个充当api的控制器。从documentation

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

此控制器的方法将返回StatusCode,而不是将用户重定向到视图。

© www.soinside.com 2019 - 2024. All rights reserved.