我想创建一个应用程序,它可以为移动应用程序提供网络环境和 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();
}