.net core dotnet core 2.1中JWT令牌返回失败

.net core dotnet core 2.1中JWT令牌返回失败,.net-core,.net Core,我想向客户端发送jwt令牌。 但是当返回jwt令牌时,它会显示一些错误。 当我尝试登录时,就会发生此错误。 最初我将我的项目数据库设置为sqlite,之后它设置为mysql。我认为这个问题是在更改数据库之后发生的 这是密码 创业班 public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public

我想向客户端发送jwt令牌。 但是当返回jwt令牌时,它会显示一些错误。 当我尝试登录时,就会发生此错误。 最初我将我的项目数据库设置为sqlite,之后它设置为mysql。我认为这个问题是在更改数据库之后发生的 这是密码

创业班

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.AddDbContext<DataContext>(s => s.UseMySql(Configuration.GetConnectionString("DefaultConnection")));

        IdentityBuilder builder = services.AddIdentityCore<User>(opt =>
        {
            opt.Password.RequireDigit = false;
            opt.Password.RequiredLength = 4;
            opt.Password.RequireNonAlphanumeric = false;
            opt.Password.RequireUppercase = false;
        });

        builder = new IdentityBuilder(builder.UserType, typeof(Role), builder.Services);
        builder.AddEntityFrameworkStores<DataContext>();
        builder.AddRoleValidator<RoleValidator<Role>>();
        builder.AddRoleManager<RoleManager<Role>>();
        builder.AddSignInManager<SignInManager<User>>();



        // services.AddAuthorization(options => {
        //     options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("Admin"));
        //     options.AddPolicy("SuperAdminPhotoRole", policy => policy.RequireRole("SuperAdmin"));
        // });

        services.AddMvc(options =>
        {
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
        .AddJsonOptions(opt =>
        {
            opt.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        });
        services.AddCors();
        services.AddAutoMapper();
        services.AddTransient<Seed>();
        services.AddScoped<IAuthRepository, AuthRepository>();
        services.AddScoped<IDatingRepository, DatingRepository>();
          services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
          .AddJwtBearer(options =>
          {
              options.TokenValidationParameters = new TokenValidationParameters
              {
                  ValidateIssuerSigningKey = true,
                  IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII
                    .GetBytes(Configuration.GetSection("AppSettings:Token").Value)),
                  ValidateIssuer = false,
                  ValidateAudience = false
              };
          });
          services.AddScoped<LogUserActivity>();

    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, Seed seeder)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {

            app.UseExceptionHandler(builder =>
            {
                builder.Run(async context =>
                {
                    context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

                    var error = context.Features.Get<IExceptionHandlerFeature>();
                    if (error != null)
                    {
                        context.Response.AddApplicationError(error.Error.Message);
                        await context.Response.WriteAsync(error.Error.Message);
                    }
                });
            });

            // app.UseHsts();
        }

        // app.UseHttpsRedirection();
        seeder.SeedUsers();
        app.UseCors(x => x.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
        app.UseStaticFiles();
        app.UseAuthentication();
        app.UseMvc();
    }
}
公共类启动
{
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务)
{
services.AddDbContext(s=>s.UseMySql(Configuration.GetConnectionString(“DefaultConnection”));
IdentityBuilder builder=services.AddIdentityCore(opt=>
{
opt.Password.RequireDigit=false;
opt.Password.RequiredLength=4;
opt.Password.RequireNonAlphanumeric=false;
opt.Password.RequireUppercase=false;
});
builder=newidentitybuilder(builder.UserType、typeof(Role)、builder.Services);
builder.AddEntityFrameworkStores();
builder.AddRoleValidator();
builder.AddRoleManager();
builder.AddSignInManager();
//services.AddAuthorization(选项=>{
//options.AddPolicy(“requiredminrole”,policy=>policy.RequireRole(“Admin”);
//options.AddPolicy(“SuperAdminPhotoRole”,policy=>policy.RequireRole(“SuperAdmin”);
// });
services.AddMvc(选项=>
{
var policy=new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()文件
.Build();
options.Filters.Add(新的授权过滤器(策略));
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddJsonOptions(opt=>
{
opt.SerializerSettings.ReferenceLoopHandling=Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});
services.AddCors();
services.AddAutoMapper();
services.AddTransient();
services.addScope();
services.addScope();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(选项=>
{
options.TokenValidationParameters=新的TokenValidationParameters
{
ValidateSuersigningKey=true,
IssuerSigningKey=新的SymmetricSecurityKey(Encoding.ASCII
.GetBytes(Configuration.GetSection(“AppSettings:Token”).Value)),
validateisuer=false,
ValidateAudience=false
};
});
services.addScope();
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
公共无效配置(IApplicationBuilder应用程序、IHostingEnvironment环境、种子播种机)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
其他的
{
app.UseExceptionHandler(生成器=>
{
运行(异步上下文=>
{
context.Response.StatusCode=(int)HttpStatusCode.InternalServerError;
var error=context.Features.Get();
if(错误!=null)
{
context.Response.AddApplicationError(error.error.Message);
wait context.Response.WriteAsync(error.error.Message);
}
});
});
//app.UseHsts();
}
//app.UseHttpsRedirection();
seeder.SeedUsers();
app.UseCors(x=>x.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc();
}
}
下面是身份验证控制器代码

[AllowAnonymous]
    [Route("api/[controller]")]
    [ApiController]
    public class AuthController : ControllerBase
    {
        private readonly IAuthRepository _repo;
        private readonly IConfiguration _config;
        private readonly IMapper _mapper;
        private readonly UserManager<User> _userManager;
        private readonly SignInManager<User> _signInManager;

        public AuthController(IConfiguration config,
         IMapper mapper, UserManager<User> userManager,
         SignInManager<User> signInManager)
        {
            _signInManager = signInManager;
            _userManager = userManager;
            _config = config;
            _mapper = mapper;
        }

        [HttpPost("register")]
        public async Task<IActionResult> Register(UserForRegisterDto userForRegisterDto)
        {
            try
            {
                var userToCreate = _mapper.Map<User>(userForRegisterDto);
                var result = await _userManager.CreateAsync(userToCreate, userForRegisterDto.Password);
                var userToReturn = _mapper.Map<UserForDetailedDto>(userToCreate);

                if (result.Succeeded)
                {
                    return CreatedAtRoute("GetUser", new { Controller = "Users", id = userToReturn.Id }, userToReturn);
                }

                return BadRequest(result.Errors);

            }
            catch (Exception e)
            {
                return BadRequest("An error occurs while registering:" + e.ToString());
            }
        }

        [HttpPost("login")]
        public async Task<IActionResult> Login(UserForLoginDto userForLoginDto)
        {
            try
            {
                var user = await _userManager.FindByNameAsync(userForLoginDto.Username);
                var result = await _signInManager.CheckPasswordSignInAsync(user, userForLoginDto.Password, false);

                if (result.Succeeded)
                {
                    var appUser = await _userManager.Users.Include(p => p.Photos)
                    .FirstOrDefaultAsync(u => u.NormalizedUserName == userForLoginDto.Username.ToUpper());

                    var userToReturn = _mapper.Map<UserForListDto>(appUser);


                    return Ok(new
                    {
                        token = GenerateJwtToken(appUser),
                        user = userToReturn
                    });
                }

                return Unauthorized();
            }
            catch (Exception e)
            {
                return BadRequest("An error occurs while loggin:" + e.ToString());
            }

        }

        private async Task<string> GenerateJwtToken(User user)
        {
            var claims = new List<Claim> {
                new Claim(ClaimTypes.NameIdentifier,user.Id.ToString()),
                new Claim(ClaimTypes.Name, user.UserName)
        };

            var roles = await _userManager.GetRolesAsync(user);

            foreach (var role in roles)
            {
                claims.Add(new Claim(ClaimTypes.Role, role));
            }

            var key = new SymmetricSecurityKey(Encoding.UTF8
            .GetBytes(_config.GetSection("AppSettings:Token").Value));

            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha512Signature);

            var tokenDescripter = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(claims),
                Expires = DateTime.Now.AddDays(1),
                SigningCredentials = creds
            };

            var tokenHandler = new JwtSecurityTokenHandler();

            var token = tokenHandler.CreateToken(tokenDescripter);

                  return tokenHandler.WriteToken(token);
        }
    }
[AllowAnonymous]
[路由(“api/[控制器]”)]
[ApiController]
公共类AuthController:ControllerBase
{
私有只读IAuthRepository\u repo;
专用只读IConfiguration\u config;
专用只读IMapper\u映射器;
私有只读用户管理器_UserManager;
专用只读签名管理器\u签名管理器;
公共授权控制器(IConfiguration配置,
IMapper映射器、用户管理器、用户管理器、,
SignInManager(签名管理员)
{
_signInManager=signInManager;
_userManager=userManager;
_config=config;
_映射器=映射器;
}
[HttpPost(“注册”)]
公共异步任务寄存器(UserForRegisterTo UserForRegisterTo)
{
尝试
{
var userToCreate=\u mapper.Map(userForRegisterDto);
var result=await\u userManager.CreateAsync(userToCreate,userForRegisterDto.Password);
var userToReturn=\u mapper.Map(userToCreate);
if(result.successed)
{
返回CreatedAtRoute(“GetUser”,new{Controller=“Users”,id=usertoreReturn.id},usertoreReturn);
}
返回错误请求(result.Errors);
}
捕获(例外e)
{
return BadRequest(“注册时出错:+e.ToString());
}
}
[HttpPost(“登录”)]
公共异步任务登录(UserForLoginTo UserForLoginTo)
{
尝试
{
var user=await\u userManager.FindByNameAsync(userForLoginDto.Username);
var result=wait _signInManager.CheckPasswordSignInAsync(user,userForLoginDto.Password,false);
if(result.successed)
{
var appUser=await\u userManager.Users.Include(p=>p.Photos)
.FirstOrDefaultAsync(u=>u.NormalizedUserName
    Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HLJ0BIR31H6O", Request id "0HLJ0BIR31H6O:00000001": An unhandled exception was thrown by the application.
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.PlatformNotSupportedException: This instance contains state that cannot be serialized and deserialized on this platform.
   at System.Security.Claims.ClaimsPrincipal.OnSerializingMethod(StreamingContext context)
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at Newtonsoft.Json.Serialization.JsonContract.<>c__DisplayClass57_0.<CreateSerializationCallback>b__0(Object o, StreamingContext context)
   at Newtonsoft.Json.Serialization.JsonContract.InvokeOnSerializing(Object o, StreamingContext context)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.OnSerializing(JsonWriter writer, JsonContract contract, Object value)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
return Ok(new {
                        token = GenerateJwtToken(appUser).Result,
                        user = userToReturn
              });