添加授权属性时,Web API核心返回404

时间:2018-08-27 11:14:29

标签: c# asp.net-core jwt asp.net-core-webapi

我是.net核心的新手,我正在尝试创建实现jwt以便进行身份验证和授权的Web api核心。

在内部启动类中,我是这样配置的:

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.AddDbContext<MandarinDBContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("MyConnection")));

        services.AddIdentity<User, Role>()
        .AddEntityFrameworkStores<MyDBContext>()
        .AddDefaultTokenProviders();

        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options =>
                {
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuer = false,
                        ValidateAudience = false,
                        ValidateLifetime = true,
                        ValidateIssuerSigningKey = true,
                        ValidIssuer = "yourdomain.com",
                        ValidAudience = "yourdomain.com",
                        IssuerSigningKey = new SymmetricSecurityKey(
                            Encoding.UTF8.GetBytes("My secret goes here"))
                    };

                    options.RequireHttpsMetadata = false;
                });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        // Add application services.
        services.AddTransient<IUserService, UserService>();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.UseHttpsRedirection();

        app.UseAuthentication();
        app.UseMvc();
    }
}

但是当我尝试调用以下操作时:

    [Authorize]
    [HttpGet]
    [Route("api/Tokens")]
    public IActionResult TestAuthorization()
    {
        return Ok("You're Authorized");
    }

找不到404。如果我删除Authorize属性,则它可以正常工作。

您能指导我解决这个问题吗?

3 个答案:

答案 0 :(得分:6)

未授权您的API且您的重定向URL不存在时,就会发生这种情况。 身份验证失败时,Web API将发送401代码。现在,如果要在客户端上处理此代码并为授权失败进行重定向,请确保已存在重定向的URL。 另外,请勿将[Authorize]属性添加到处理身份验证方法(登录/注册)的控制器。 您的罪魁祸首似乎是“授权”属性。由于您正在使用JWT身份验证方案。您的授权属性应遵循

    [Authorize(AuthenticationSchemes = "Bearer")]
    [HttpGet]
    [Route("api/Tokens")]
    public IActionResult TestAuthorization()
    {
        return Ok("You're Authorized");
    }

要使其成为默认身份验证方案,请将AddIdentity更改为AddIdentityCore。这是一篇很好的文章。

Using JwtBearer Authentication in an API-only ASP.NET Core Project

答案 1 :(得分:1)

当您使用 JwtBearer 令牌时,您可以将此代码段添加到您的 ConfigureServices 中:

  services.AddControllers(opt => {
            var policy = new AuthorizationPolicyBuilder("Bearer").RequireAuthenticatedUser().Build();
            opt.Filters.Add(new AuthorizeFilter(policy));
        })

这将在整个应用程序中设置承载身份验证策略,并要求每个端点上的用户都经过身份验证。 此外,您不需要将 [Authorize] 放在方法上,如果您希望端点和控制器可供未经身份验证的用户使用,您可以将 [AllowAnonymous] 放在它们上。

注意:这适用于 .net core 3.1

答案 2 :(得分:0)

我遇到了和你一样的问题,我通过修改ConfigureServices设法解决了

从这里

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(..)

到这里

services.AddAuthentication(options => {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;})
 .AddJwtBearer(...);