Asp .Net Core 为什么即使用户未通过身份验证也会调用我的授权处理程序?

我有一个问题,如果我手动转到登录后的页面,我会在我的一个保单句柄中遇到异常,因为它找不到索赔。


为什么会发生这种情况而不是将用户重定向到登录页面,因为他没有通过身份验证?我什至设置了身份验证方案,因为我所有的页面都有


[Authorize("scheme"), Policy = "policy"]

这是我的整个启动代码


public class Startup

{

    public Startup(IConfiguration configuration)

    {

        Configuration = configuration;

    }


    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.AddAuthentication()

         .AddCookie("ProductionAuth", options =>

         {

             options.ExpireTimeSpan = TimeSpan.FromDays(1);

             options.LoginPath = new PathString("/Production/Index");

             options.LogoutPath = new PathString("/Production/Logout");

             options.AccessDeniedPath = new PathString("/Production/AccessDenied/");

             options.SlidingExpiration = true;

         })

        .AddCookie("AdministrationAuth", options =>

        {

            options.ExpireTimeSpan = TimeSpan.FromDays(1);

            options.LoginPath = new PathString("/Administration/Index");

            options.LogoutPath = new PathString("/Administration/Logout");

            options.AccessDeniedPath = new PathString("/Administration/AccessDenied/");

            options.SlidingExpiration = true;

        });


        services.AddAuthorization(options =>

        {

            options.AddPolicy("HasArranqueActivo", policy =>

                policy.RequireAuthenticatedUser()

                .AddAuthenticationSchemes("ProductionAuth")

                .Requirements.Add(new HasArranqueActivoRequirement()

            ));

人到中年有点甜
浏览 133回答 3
3回答

MMMHUHU

文档中有一条重要说明可以解决此问题:即使身份验证失败,也会调用授权处理程序。在您的情况下,身份验证失败但您的IsParagemNotOnGoingHandler'HandleRequirementAsync仍在被调用。要解决此问题,您只需让您的处理程序实现对丢失的声明更具弹性。这是完整性的示例:protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, IsParagemNotOnGoingRequirement requirement){    if (!context.User.HasClaim(c => c.Type == ClaimTypes.PrimarySid))        return Task.CompletedTask;    ...}Convert.ToInt32对于声明的值不可转换为int.

精慕HU

文档中有一条重要说明可以解决此问题:即使身份验证失败,也会调用授权处理程序。在您的情况下,身份验证失败但您的IsParagemNotOnGoingHandler'HandleRequirementAsync仍在被调用。要解决此问题,您只需让您的处理程序实现对丢失的声明更具弹性。这是完整性的示例:protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, IsParagemNotOnGoingRequirement requirement){    if (!context.User.HasClaim(c => c.Type == ClaimTypes.PrimarySid))        return Task.CompletedTask;    ...}Convert.ToInt32对于声明的值不可转换为int.

白猪掌柜的

在您的 中AuthorizationHandler,您可以通过访问属性来检查用户是否已通过身份验证,context.User.Identity.IsAuthenticated如下所示:protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, YourRequirementType requirement){    if (context.User.Identity == null || !context.User.Identity.IsAuthenticated)    {        _logger.LogDebug("Authorization Failed: User not authenticated.");        context.Fail(new AuthorizationFailureReason(this, $"User not authenticated"));        return Task.CompletedTask;    }
打开App,查看更多内容
随时随地看视频慕课网APP