services.AddIdentity 导致我的控制器端点响应 404

Mat*_*att 2 identity asp.net-core

在向我的应用程序添加新的承载身份验证方面,我遇到了一些困难,我无法弄清楚,我需要的一段代码导致我的端点返回 404 错误,但删除后我能够成功访问没有 404 错误的端点,请参见下文。

首先,我的应用程序既充当身份服务器,又充当接受不记名令牌的 API。

        services.AddAuthentication("Bearer")
            .AddJwtBearer("Bearer", options =>
            {
                options.Authority = "https://www.example.com/";
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateAudience = false
                };
            });

        services.AddAuthorization(options =>
        {
            options.AddPolicy("ApiScope", policy =>
            {
                policy.RequireAuthenticatedUser();
                policy.RequireClaim("scope", "openid");
            });
        });

        // THIS IS THE CODE CAUSING THE 404 ERROR
        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<DevContext>();
Run Code Online (Sandbox Code Playgroud)

从上面来看,如果我尝试到达使用 [Authorize] 装饰的控制器端点,那么我会看到 404 响应。如果我注释掉最后几行(请参阅代码中的注释),那么我就能够成功到达我的端点。

为什么我会收到 404 错误?我认为这一定是因为 .AddIdentity 正在覆盖承载身份验证,并且因为我的控制器用 [Authorize] 装饰,所以我无法访问它?

难道我的应用程序不能同时作为 API 和身份服务器吗?


这是当有问题的代码被取消注释时(404 响应)我在输出日志中看到的内容:

Microsoft.AspNetCore.Hosting.Diagnostics: Information: Request starting HTTP/2.0 GET https://localhost:44310/api
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService: Information: Authorization failed.
Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler: Information: AuthenticationScheme: Identity.Application was challenged.
Microsoft.AspNetCore.Hosting.Diagnostics: Information: Request finished in 13.422ms 302 
Microsoft.AspNetCore.Hosting.Diagnostics: Information: Request starting HTTP/2.0 GET https://localhost:44310/Account/Login?ReturnUrl=%2Fapi
Microsoft.AspNetCore.Hosting.Diagnostics: Information: Request finished in 2.0776ms 404 
Run Code Online (Sandbox Code Playgroud)

这是我在评论有问题的代码时看到的(成功响应):

Microsoft.AspNetCore.Hosting.Diagnostics: Information: Request starting HTTP/2.0 GET https://localhost:44310/api
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler: Information: Successfully validated the token.
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService: Information: Authorization was successful.
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 6

柯克·拉金 (Kirk Larkin) 的评论帮助解决了这个问题,总结一下:

  1. AddIdentity必须放在调用之上AddAuthentication
  2. 我的控制器必须装饰[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]