首页 > 解决方案 > 调用 ASP.NET Core 2.1 API 时出现 401。这是CORS问题吗?

问题描述

过去几天我一直在尝试解决 401 错误,但没有成功。

托管在 IIS 后面的 ASP.NET Core 2.1 API。我正在尝试使用 Windows 授权访问 API,但我遇到了登录提示的挑战。如果我不输入用户名和密码,我会收到 401 错误(附截图)。我已经阅读了我能找到的所有文章,并相信我已经正确配置了 CORS。

根据屏幕截图,这看起来像 CORS 问题吗?我正在通过 swagger 进行测试,并且正在从我认为是同一个域的领域中调用。有人对可能出现的问题有任何建议吗?

请求信息

标签: asp.net-corecors

解决方案


从我在此屏幕截图中看到的情况来看,一切正常。在这种情况下,401 是一个可取的错误,它也证明您对 CORS 没有任何问题,因为 API 以适当的方式响应您的请求。

要突破 Api,您应该关注“响应标头”部分,其中身份验证类型定义为BEARER

由此我们可以得出结论,身份验证是基于令牌的,并且在实践中的工作方式如下:

通过通过 Windows 身份验证正确登录,WebAPI 在标头中提供一个响应令牌,将您标识为用户。为了访问 API,您应该将此令牌存储在本地,然后通过将其添加到每个请求的标头部分来使用它。

要了解有关 swagger 中基于令牌的身份验证的更多信息,请查看 https://swagger.io/docs/specification/authentication/bearer-authentication/

要了解令牌的工作原理,请查看https://jwt.io/

下面是一个例子,说明如何通过在asp net core应用的启动类中配置swagger来达到预期的目的。

public void ConfigureServices(IServiceCollection services)
    {
        //other code removed for brevity 
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info { Title = "My App API", Version = "v1" });
            c.CustomSchemaIds((type) => type.FullName);
            c.DescribeAllEnumsAsStrings();
            c.DescribeAllParametersInCamelCase();
            c.EnableAnnotations();
            c.OperationFilter<FormFileOperationFilter>();

            var apiXmlDocFileName = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";            
            var apiXmlDocFilePath = Path.Combine(AppContext.BaseDirectory, apiXmlDocFileName);
            c.IncludeXmlComments(apiXmlDocFilePath);
            c.AddFluentValidationRules();
            c.AddSecurityDefinition("Bearer", new ApiKeyScheme() //this is desireable line
            {
                Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
                Name = "Authorization",
                In = "header"
            });
            c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>> { { "Bearer", Enumerable.Empty<string>() } });

        });     
    }

实现此功能后,您将能够直接从 swagger UI 将令牌添加到所有请求。

您还可以使用 Postman https://learning.getpostman.com/docs/postman/sending-api-requests/authorization/实现预期目标

希望能帮助到你。


推荐阅读