带有 API 密钥和 JWT 令牌的 Net Core API

Posted

技术标签:

【中文标题】带有 API 密钥和 JWT 令牌的 Net Core API【英文标题】:Net Core API with API Key and JWT token 【发布时间】:2020-09-15 04:34:45 【问题描述】:

我有一个 .Net Core API,其中一些端点需要 JWT 授权,而其他端点需要 API 密钥授权。在 startup.cs 中配置 JWT 身份验证后,我在需要 JWT 令牌的方法上使用 Authorize 时为 API Key 方法实现一个属性。我在正确的轨道上吗?我是 .Net Core 和 API 的新手,感谢任何帮助。

【问题讨论】:

显示一些代码? 【参考方案1】:

是的,没错,如你所知启动类配置应用的请求管道以及所有请求的处理方式

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using WebApi.Helpers;
using WebApi.Services;
using Microsoft.IdentityModel.Tokens;
using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;

namespace WebApi

    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.AddCors();
            services.AddControllers();

            // configure strongly typed settings objects
            var appSettingsSection = Configuration.GetSection("AppSettings");
            services.Configure<AppSettings>(appSettingsSection);

            // configure jwt authentication
            var appSettings = appSettingsSection.Get<AppSettings>();
            var key = Encoding.ASCII.GetBytes(appSettings.Secret);
            services.AddAuthentication(x =>
            
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            )
            .AddJwtBearer(x =>
            
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new TokenValidationParameters
                
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(key),
                    ValidateIssuer = false,
                    ValidateAudience = false
                ;
            );

            // configure DI for application services
            services.AddScoped<IUserService, UserService>();
        

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            app.UseRouting();

            // global cors policy
            app.UseCors(x => x
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());

            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints => 
                endpoints.MapControllers();
            );
        
    

【讨论】:

谢谢@hesam akbari。这基本上就是我在 startup.cs 中的内容。我对需要 JWT 令牌的方法使用 Authorize 属性,对需要 API 密钥的方法使用 API 密钥过滤器。但是,当我大摇大摆地测试它时,需要 JWT 的仍然要求提供 API 密钥。也许这是我招摇的设置?

以上是关于带有 API 密钥和 JWT 令牌的 Net Core API的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core 自定义身份验证使用 API 密钥和 Identity Server 4

Pubsub 使用错误的密钥签署 JWT 令牌以进行推送

使用密钥大小小于2048的RSA安全密钥创建JWT令牌时出错

NET Core 3.1 MVC 授权/身份验证,带有在单独的 Net Core 3.1 Web Api 中从外部获取的令牌 (JWT)

.Net Core JWT 身份验证与自定义 API 密钥中间件

在 Rest API 中使用 Facebook 在 Express 和 NodeJS 中维护 JWT 的密钥和访问令牌