Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET核心2授权属性jwt_C#_Asp.net Core_Jwt_Asp.net Core Identity - Fatal编程技术网

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我更新了我的代码。请查收