C# ASP.NET核心2授权属性jwt
请告诉我为什么这个代码不起作用C# ASP.NET核心2授权属性jwt,c#,asp.net-core,jwt,asp.net-core-identity,C#,Asp.net Core,Jwt,Asp.net Core Identity,请告诉我为什么这个代码不起作用 public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this meth
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.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = AuthOptions.ISSUER,
ValidateAudience = true,
ValidAudience = AuthOptions.AUDIENCE,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = AuthOptions.GetSymmetricSecurityKey()
};
});
services.AddDbContext<ApplicationContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<User, IdentityRole>().AddEntityFrameworkStores<ApplicationContext>();
services.AddMvc();
}
// 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();
}
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action}/{id?}",
defaults: new { controller = "Home", action = "Index" });
});
}
}
公共类启动
{
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务)
{
services.AddAuthentication(选项=>
{
options.DefaultScheme=JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme=JwtBearerDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme=JwtBearerDefaults.AuthenticationScheme;
options.defaultsignnscheme=JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(选项=>
{
options.RequireHttpsMetadata=false;
options.TokenValidationParameters=新的TokenValidationParameters
{
validateisuer=true,
ValidIssuer=AuthOptions.ISSUER,
ValidateAudience=true,
Validudience=AuthOptions.AUDIENCE,
ValidateLifetime=true,
ValidateSuersigningKey=true,
IssuerSigningKey=AuthOptions.GetSymmetricSecurityKey()
};
});
services.AddDbContext(选项=>
options.UseSqlServer(Configuration.GetConnectionString(“DefaultConnection”));
services.AddIdentity().AddEntityFrameworkStores();
services.AddMvc();
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseAuthentication();
app.UseMvc(路由=>
{
routes.MapRoute(
名称:“默认”,
模板:“{controller}/{action}/{id?}”,
默认值:新建{controller=“Home”,action=“Index”});
});
}
}
我尝试删除options.Default*
并将其替换为仅JwtBearerDefaults.AuthenticationScheme
。仅当我将[Authorize]
更改为[Authorize(authorization(authorizationschemes=JwtBearerDefaults.authorizationscheme)]
时,它才起作用。但是我不想为每个属性使用AuthenticationSchemes
属性。服务。AddIdentity(…)
设置ASP.NET核心标识,该标识使用基于表单的身份登录工作所需的Cookie身份验证注册多个Cookie身份验证方案
作为其中的一部分,它还为IdentityConstants.ApplicationScheme
设置默认身份验证和质询方案
由于在AddAuthentication
之后调用AddIdentity
,您为后者所做的默认配置将被标识配置覆盖。因此,要解决您的问题,您必须确保在注册标识后在标识选项中设置默认方案
services.AddIdentity<User, IdentityRole>()
.AddEntityFrameworkStores<ApplicationContext>();;
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(…);
services.AddIdentity()
.AddEntityFrameworkStores();;
services.AddAuthentication(选项=>
{
options.DefaultScheme=JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme=JwtBearerDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme=JwtBearerDefaults.AuthenticationScheme;
options.defaultsignnscheme=JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(…);
请注意,这将明显停止ASP.NET核心标识的身份验证cookie,使其成为默认的身份验证和质询方案。因此,如果您的应用程序也有未使用JWT承载的区域,那么这些区域将停止工作,并需要显式的身份验证属性才能切换回身份cookie。服务。附加身份(…)
设置ASP.NET核心标识,该标识使用基于表单的标识登录所需的Cookie身份验证注册多个Cookie身份验证方案
作为其中的一部分,它还为IdentityConstants.ApplicationScheme
设置默认身份验证和质询方案
由于在AddAuthentication
之后调用AddIdentity
,您为后者所做的默认配置将被标识配置覆盖。因此,要解决您的问题,您必须确保在注册标识后在标识选项中设置默认方案
services.AddIdentity<User, IdentityRole>()
.AddEntityFrameworkStores<ApplicationContext>();;
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(…);
services.AddIdentity()
.AddEntityFrameworkStores();;
services.AddAuthentication(选项=>
{
options.DefaultScheme=JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme=JwtBearerDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme=JwtBearerDefaults.AuthenticationScheme;
options.defaultsignnscheme=JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(…);
请注意,这将明显停止ASP.NET核心标识的身份验证cookie,使其成为默认的身份验证和质询方案。因此,如果您的应用程序也有不使用JWT承载的区域,那么这些区域将停止工作,并需要显式的身份验证属性才能切换回身份cookie。您的启动中是否有其他身份验证或与身份相关的内容?@poke I更新了我的代码。请检查您的启动中是否有其他与身份验证或身份相关的内容?@poke我更新了我的代码。请查收