为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
人到中年有点甜 2023-05-13 16:21:56
我有一个问题,如果我手动转到登录后的页面,我会在我的一个保单句柄中遇到异常,因为它找不到索赔。为什么会发生这种情况而不是将用户重定向到登录页面,因为他没有通过身份验证?我什至设置了身份验证方案,因为我所有的页面都有[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()            ));
查看完整描述

3 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

文档中有一条重要说明可以解决此问题:


即使身份验证失败,也会调用授权处理程序。


在您的情况下,身份验证失败但您的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.


查看完整回答
反对 回复 2023-05-13
?
精慕HU

TA贡献1845条经验 获得超8个赞

文档中有一条重要说明可以解决此问题:


即使身份验证失败,也会调用授权处理程序。


在您的情况下,身份验证失败但您的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.


查看完整回答
反对 回复 2023-05-13
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

在您的 中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;

    }


查看完整回答
反对 回复 2023-05-13
  • 3 回答
  • 0 关注
  • 129 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信