首页 > 解决方案 > 与 ASP.NET Core 中的 Cookie 回退进行协商

问题描述

我有一个标题中描述的设置,其中包含一个默认策略,其中包含可以通过相应处理程序满足的要求:

protected override async Task HandleRequirementAsync(AuthorizationHandlerContext authorizationContext, AccessRequirement requirement)
        {
            var httpContext = _httpContextAccessor.HttpContext;
            var identity = authorizationContext.User.Identity;

            if (!identity.IsAuthenticated)
            {
                var result = await httpContext.AuthenticateAsync({"Negotiate || Cookie"});
                if (!result.Succeeded)
                {
                    return;
                }
            }
            authorizationContext.Succeed(requirement);
        }

只要我不通过默认策略调用这些处理程序,即使可以解决协商身份验证,站点也会显示简单的 401。在没有处理程序的情况下解决此问题的方法实际上也可以解决后续问题。如果我优先考虑协商(通过明确设置默认方案或首先注册它),如果协商不可用,将提示用户输入他的 Active Directory 凭据,而它应该回退到 Cookie 身份验证。但是,如果我优先考虑 Cookie 身份验证,即使 Negotiate 可以工作,也会提示用户输入他的 Cookie 专用凭据。

是否有任何配置允许某种尝试捕获机制尝试协商并在无法解决时立即回退到另一个方案?我通过设置不同的参数进行了篡改,DefaultChallengeScheme但到目前为止还没有成功。

标签: asp.net-coreauthentication.net-corewindows-authenticationasp.net-core-identity

解决方案


对于 401 的问题:当你在启动中添加服务时:services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)。这里的“JwtBearerDefaults.AuthenticationScheme”是在不请求特定方案时默认使用的方案名称。但是,当 Authorization 调用身份验证质询时,JWT 不记名方案返回带有 www-authenticate:bearer 标头的 401 结果。

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/?view=aspnetcore-5.0

如果您想使用多种身份验证方法,您可以尝试“AuthenticationSchemeOptions Class”,该类内部可以设置属性。

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.authentication.authenticationschemeoptions?view=aspnetcore-5.0


推荐阅读