如何同时实现 JWT 身份验证和身份验证?

时间:2021-03-17 08:41:36

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

我想创建一个应用程序,它可以为移动应用程序提供网络环境和 API。当然,身份验证和授权是需要的,我认为 Identity 对网络有好处,而 JWT 对移动有好处,所以我决定同时使用它们。我对我的项目的看法是,无论是已识别用户还是生成令牌都可以使用授权 api。问题是当我同时实现它们时,Identity 方法是我唯一可以使用的方法。我该如何解决这个问题?

我的 startup.cs 实现了两者:

services.AddAuthentication("DemoAuth").AddJwtBearer("DemoAuth", config =>
            {
                var secretByte = Encoding.UTF8.GetBytes(Constants.SECRET);
                var key = new SymmetricSecurityKey(secretByte);
                config.Events = new JwtBearerEvents()
                {
                    OnMessageReceived = context =>
                    {
                        if (context.Request.Query.ContainsKey("access_token"))
                        {
                            context.Token = context.Request.Query["access_token"];
                        }
                        return Task.CompletedTask;
                    }
                };
            });
services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection"),
                    assembly => assembly.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName))
                    .UseLazyLoadingProxies())
                .AddIdentity<User, Role>()
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultUI().AddDefaultTokenProviders();

编辑 - 我找到了一个解决方案,使它们都存在于我的项目中。但是我有一个新问题。无论哪种身份验证方法首先声明都是默认的,它仍然拒绝共享对同一 api 进行身份验证的权限。如果我想应用第二个,我必须特别声明它使用它,因此它也不适用于第一个。

services.AddAuthentication()
                .AddCookie(config => config.SlidingExpiration = true)
                .AddJwtBearer(config =>
            {
                config.RequireHttpsMetadata = false;
                config.SaveToken = true;

                config.TokenValidationParameters = new TokenValidationParameters()
                {
                    ValidIssuer = Constants.PJ,
                    ValidAudience = Constants.PJ,
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Constants.SECRET))
                    
                };
            });

        [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
        public IActionResult Secret()
        {
            return View();
        }

0 个答案:

没有答案