Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ASP.NET核心Web身份验证允许未经授权的访问

ASP.NET核心Web身份验证允许未经授权的访问
EN

Stack Overflow用户
提问于 2019-07-10 20:28:04
回答 2查看 10.7K关注 0票数 1

我正在为我的ASP.NET核心API创建一个身份验证方案。

它调用我的处理程序并命中断点,但是API调用仍然返回结果,即使授权失败。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
    if (!Request.Headers.ContainsKey(AuthorizationHeaderName))
    {
        //Authorization header not in request
        return AuthenticateResult.Fail("Missing Authorization header");
    }

在我天真的理解中,如果身份验证失败,它不应该返回数据。

我遗漏了什么?

详细信息

我在Startup.ConfigureServices中注册了这样的方案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
services.AddAuthentication(options => {
    // This (options.Default..Scheme) causes the default authentication scheme to be set.
    // Without this, the Authorization header is not checked and
    // you'll get no results. 
   options.DefaultAuthenticateScheme = BasicAuthenticationDefaults.AuthenticationScheme;
}).AddScheme<BasicAuthenticationOptions, BasicAuthenticationHandler>("Basic", null);

Startup.Config调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 app.UseAuthentication();
 app.UseHttpsRedirection();
 app.UseMvc();

其余代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using Microsoft.AspNetCore.Authentication;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Net.Http.Headers;
using System.Security.Claims;
using System.Text;
using System.Text.Encodings.Web;
using System.Threading.Tasks;

namespace WebAPI.Authentication
{
    public interface IBasicAuthenticationService
    {
        Task<AuthenticateResult> HandleAuthenticateAsync();
    }

    public static class BasicAuthenticationDefaults
    {
        public const string AuthenticationScheme = "Basic";
    }

    public class BasicAuthenticationOptions : AuthenticationSchemeOptions
    { }

    public class BasicAuthenticationHandler : AuthenticationHandler<BasicAuthenticationOptions>
    {
        private const string AuthorizationHeaderName = "Authorization";
        private const string BasicSchemeName = "Basic";

        public BasicAuthenticationHandler(
            IOptionsMonitor<BasicAuthenticationOptions> options,
            ILoggerFactory logger,
            UrlEncoder encoder,
            ISystemClock clock)
            : base(options, logger, encoder, clock)
        {
        }

        protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
        {
            if (!Request.Headers.ContainsKey(AuthorizationHeaderName))
            {  // Rejected here. Should fail.
                //Authorization header not in request
                return AuthenticateResult.Fail("Missing Authorization header");
            }

            if ....  // never gets this far
            }

            return AuthenticateResult.Success(ticket);
        }
    }
}

这是控制器,它不正确地返回结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;

namespace TMAWebAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "value1", "value2" };
        }
    } 
}

所有这些代码行都会在调试器中命中,因此该部分似乎工作正常。

但是API调用仍然返回结果,即使它失败了身份验证。

更新:

向Controller添加AuthenticationScheme属性会使其失败。

如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Route("api/[controller]")]
[ApiController]
[Authorize(AuthenticationSchemes = "Basic")]
public class ValuesController : ControllerBase

这不是好事。默认情况下,它应该失败,而不是必须将其添加到每个控制器中。

更新2:

向services.AddMvc添加一个过滤器看起来很有希望,但也不起作用。文档声明您不必实现授权筛选器,因为它们包括在内。我找不到。

我继承了AuthorizeAttribute,使用了AddMvc所要求的Matti和IFilterMetadata的想法。它编译但仍然允许未经授权的访问。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class BasicAuthorizeAttribute : AuthorizeAttribute, IFilterMetadata { }       

services.AddMvc(options => {
    options.Filters.Add(typeof(BasicAuthorizeAttribute));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

更新3:

试过

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser()

就像马蒂建议的那样,但那又回来了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found.

我对重定向到API不存在的登录页面没有任何兴趣,所以我尝试了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
policy = new AuthorizationPolicyBuilder().AddAuthenticationSchemes(new[] {BasicAuthenticationDefaults.AuthenticationScheme })

它编译但抛出异常。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
InvalidOperationException Message=AuthorizationPolicy must have at least one requirement.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-12 20:23:27

您需要将[Authorize]属性添加到控制器中,以使授权能够实际对其结果执行任何操作。您可以在全球范围内添加如下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
services.AddMvc(config =>
{
    var policy = new AuthorizationPolicyBuilder()
                 .RequireAuthenticatedUser()
                 .Build();
    config.Filters.Add(new AuthorizeFilter(policy));
});
票数 2
EN

Stack Overflow用户

发布于 2019-07-17 10:50:20

最后的分辨率使用AddMVC。解决办法是,除了增加一个方案外,该计划还需要一个要求。

这挺管用的。如果我没有发送任何auth标头,它将返回一个空页。如果我发送过期的标头,它会发送500。应该是401。但它不返回任何值,这才是我真正关心的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TokenAuthorizationRequirement: IAuthorizationRequirement {}

services.AddMvc(config => {
   var policy = new AuthorizationPolicyBuilder()
      .AddAuthenticationSchemes(new[] {BasicAuthenticationDefaults.AuthenticationScheme })
      .AddRequirements(new BasicAuthorizationRequirement())
      .Build();
   config.Filters.Add(new AuthorizeFilter(policy));
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56981640

复制
相关文章
MongoDB下的未经授权访问漏洞
MongoDB是一个基于分布式文件存储的优秀数据库。它是基于C++语言编写的。主要的用途是在为WEB应用提供可扩展的高性能数据存储解决方案。
洛米唯熊
2019/10/31
2.6K0
MongoDB下的未经授权访问漏洞
未经授权访问测试【补天学习笔记】
  因为我之前是在burpsuite里怼着接口去掉cookie测未经授权访问的,基本算是灰盒测试。
逆向小白
2023/10/16
2230
未经授权访问测试【补天学习笔记】
eureka实现基于身份验证和授权的访问控制
在现实应用场景中,服务注册中心需要具备一定的安全性来保护数据和系统。本文将详细介绍如何在Eureka中实现基于身份验证和授权的访问控制。
堕落飞鸟
2023/04/07
2.5K0
Jenkins RCE 通过未经身份验证的 API
Jenkins(连续集成服务器)默认安装允许未经身份验证访问 Jenkins 主服务器上的 API(默认行为)。允许未经身份验证访问 groovy 脚本控制台,允许攻击者执行 shell 命令和/或连接回反向 shell。
Khan安全团队
2021/07/08
1.1K0
Jenkins RCE 通过未经身份验证的 API
Flipboard 数据库未经授权访问用户账号密码泄露
Flipboard是一款广受欢迎的社交分享型新闻聚合应用,用户数量不低于1.5亿。据了解昨天Flipboard发布了安全通告表示,一些包含了Flipboard用户账户信息(包括账户凭证)的数据库的未授权访问。此次未经授权访问数据库发生在2018年6月2日至2019年3月23日以及2019年4月22日将近10个月内。根据Flipboard的数据,被入侵的数据库包含有用户名、实际姓名、加密保护的密码和电子邮件地址以及链接到第三方社交媒体服务的用户提供的数字令牌等。目前暂不清楚最终有多少用户受到了此次黑客入侵的影响。
墨者盾
2019/05/30
1.1K0
Flipboard 数据库未经授权访问用户账号密码泄露
VMware vCenter中未经授权的RCE
技术大佬在对vSphere Client进行分析的过程中,像往常一样采用了黑盒和白盒两种方法进行测试,重点研究了未经授权即可利用的漏洞。从Web面板,尝试发送尽可能多的不同请求,所有请求都没有Cookie标头。
洛米唯熊
2022/02/28
1.4K0
VMware vCenter中未经授权的RCE
IIS6架设网站过程常见问题解决方法总结
  如果你的服务器是2003的,它默认只支持.net,不支持asp所以须进行以下操作:
会长君
2023/04/26
2K0
Centos Web 面板 7 未经身份验证的远程代码执行 - CVE-2022-44877
[+] Centos Web Panel 7 Unauthenticated Remote Code Execution [+] Centos Web Panel 7 - < 0.9.8.1147 [
Khan安全团队
2023/02/23
9630
Centos Web 面板 7 未经身份验证的远程代码执行 - CVE-2022-44877
BBPress未经身份验证的提权漏洞分析
BBPress是一款强大的WordPress论坛插件,目前BBPress被安装在超过30万个WordPress站点上。最近BBPress<=2.6.4的版本中被曝出了一个未经身份验证的权限提升漏洞,CVSS评分为9.8。通过利用该漏洞,可以将新用户注册为BBPress论坛的管理员,从而能够进行创建/删除论坛活动、导入/导出论坛用户以及创建版主等操作。本文对该漏洞进行了详细分析。
FB客服
2020/07/22
1.3K0
Memcached 只允许本地访问 11211 端口 解决未授权漏洞
前几天网上有这么一则提示:独立服务器/VPS 且在使用 Memcache 服务的注意了,近期因 Memcache 开发人员在产品中实现对 UDP 协议支持的方式不安全,导致默认配置中将 UDP 端口暴露给外部链接,可被用于发动 DDoS 攻击,直接占满 VPS 宽带。请立即在主机内限制 11211 仅允许 localhost 访问或做好安全防护措施。解决办法就是设置Memcached 只允许本地访问,这样就不存在问题了,下面写出操作过程。 刚看到这个的时候,说实话魏艾斯博客也吓了一跳,赶紧登陆服务器检查了一
魏艾斯博客www.vpsss.net
2018/06/01
4.5K0
Office显示未经授权应该如何激活?
Office 2016专业增强版PJ最多只能使用180天,而且在你使用PJ版的Microsoft Office软件的期间,你的电脑系统和Office软件不能更新。更新之后就回到没破解前了,所有的功能直接给你灰色了。
office小助手
2022/05/06
9.3K0
Office显示未经授权应该如何激活?
mongo的身份验证和授权
刚装好的mongo,准备登陆进去测一把的,结果就给我报这个错,鄙人是新手,还不太清楚这个,现学一下~
拓荒者
2019/06/16
1.6K0
Kubernetes 1.24: 防止未经授权的卷模式转换
Kubernetes v1.24 引入了一个新的 alpha 级特性,可以防止未经授权的用户修改基于 Kubernetes 集群中已有的 VolumeSnapshot[1]创建的 PersistentVolumeClaim[2] 的卷模式。
CNCF
2022/06/10
4760
实战解读ASP.NET Core身份认证
显而易见,一个常规的身份认证用例包括两部分: ① 对用户进行身份验证 ② 在未经身份验证的用户试图访问受限资源时作出反应
有态度的马甲
2020/10/10
1.8K0
实战解读ASP.NET Core身份认证
ASP.NET实现身份模拟
使用模拟时,ASP.NET 应用程序可以选择以这些应用程序当前正为之操作的客户的身份执行。通常这样做的原因是为了避免在 ASP.NET 应用程序代码中处理身份验证和授权问题。而您依赖于 Microsoft Internet 信息服务 (IIS) 来验证用户,然后将已通过验证的标记传递给 ASP.NET 应用程序;或者,如果无法验证用户,则传递未经身份验证的标记。不论何种情况,如果启用了“模拟”,则 ASP.NET 应用程序会模拟所收到的任何标记。当前模拟客户的 ASP.NET 应用程序依赖于 NTFS 目录和文件中的设置来允许客户获得访问权限或拒绝其访问。务必将服务器文件空间格式化为 NTFS,以便可以设置访问权限。
Java架构师必看
2021/03/22
1.8K0
ASP.NET MVC 随想录——探索ASP.NET Identity 身份验证和基于角色的授权,中级篇
在前一篇文章中,我介绍了ASP.NET Identity 基本API的运用并创建了若干用户账号。那么在本篇文章中,我将继续ASP.NET Identity 之旅,向您展示如何运用ASP.NET Identity 进行身份验证(Authentication)以及联合ASP.NET MVC 基于角色的授权(Role-Based Authorization)。 本文的示例,你可以在此下载和预览: 点此进行预览 点此下载示例代码 探索身份验证与授权 在这一小节中,我将阐述和证明ASP.NET 身份验证和
用户1161731
2018/01/11
3.5K0
ASP.NET MVC 随想录——探索ASP.NET Identity 身份验证和基于角色的授权,中级篇
ASP.NET Identity入门系列教程(一) 初识Identity
摘要 通过本文你将了解ASP.NET身份验证机制,表单认证的基本流程,ASP.NET Membership的一些弊端以及ASP.NET Identity的主要优势。 目录 身份验证(Authentication)和授权(Authorization) ASP.NET身份验证方式 理解表单验证流程 认识ASP.NET Membership 拥抱ASP.NET Identity ASP.NET Identity主要组成部分 总结 身份验证(Authentication)和授权(Authorization) 我们先
刘皓
2018/04/03
4.5K0
ASP.NET Identity入门系列教程(一) 初识Identity
CVE-2023-39361|Cacti 未经身份验证SQL注入漏洞
Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具。
信安百科
2023/09/18
1K0
CVE-2023-39361|Cacti 未经身份验证SQL注入漏洞
asp.net core 3.1多种身份验证方案,cookie和jwt混合认证授权
开发了一个公司内部系统,使用asp.net core 3.1。在开发用户认证授权使用的是简单的cookie认证方式,然后开发好了要写几个接口给其它系统调用数据。并且只是几个简单的接口不准备再重新部署一个站点,所以就直接在MVC的项目里面加了一个API区域用来写接口。这时候因为是接口所以就不能用cookie方式进行认证,得加一个jwt认证,采用多种身份验证方案来进行认证授权。
SpringSun
2020/08/11
5K0
asp.net core 3.1多种身份验证方案,cookie和jwt混合认证授权
点击加载更多

相似问题

使用windows身份验证的Asp.net核心web api - Cors请求未经授权

70

ASP.NET核心2.0 -[授权]不要阻止未经授权的用户的rest访问

21

ASP.NET核心Web & Azure:未经身份验证的错误,头中的访问令牌

216

ASP.NET核心3.1 + CORS + Windows身份验证= 401未经授权

22

ASP.NET核心JWT身份验证总是抛出未经授权的401

51
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文