blazor webassembly System.Net.Http.HttpRequestException:响应状态代码未指示成功:400(错误请求)

时间:2020-01-01 18:45:04

标签: asp.net-core blazor webassembly blazor-client-side

我有一个托管在dotnet核心的blazor项目。我正在按照此tutorial进行blazor身份验证。在服务器端一切正常,因为我能够使用Postman成功创建用户。我在网上尝试了不同的建议,但对我却不起作用。一些我建议修复的CORS,我修改了一些路线,但问题仍然存在。

我在调试时遇到问题,因为我无法在浏览器控制台中找到断点。我已经调试了一些blazor项目,可以设置断点并查看局部变量,但是无法使用当前项目。我不知道它是否是错误。

enter image description here

服务器startup.cs

namespace EssentialShopCoreBlazor.Server
{
    public class Startup
    {
        public IConfiguration Configuration { get; }
        public Startup(IConfiguration _configuration)
        {
            Configuration = _configuration;
        }

        readonly string AllowSpecificOrigins = "allowSpecificOrigins";
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<DbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

            services.AddIdentity<IdentityUsersModel, IdentityRole>()
                .AddEntityFrameworkStores<DbContext>()
                .AddDefaultTokenProviders();

            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>{
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = Configuration["JwtIssuer"],
                    ValidAudience = Configuration["JwtAudience"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtSecurityKey"]))
                };
            });

            services.AddCors(options =>
            {
                options.AddPolicy(AllowSpecificOrigins,
                builder =>
                {
                    builder.WithOrigins("https://localhost:44365", "https://localhost:44398")
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
            });

            services.AddScoped<AccountAuthController>();


            services.AddMvc().AddNewtonsoftJson();
            services.AddResponseCompression(opts =>
            {
                opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
                    new[] { "application/octet-stream" });
            });
        }


       // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseResponseCompression();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBlazorDebugging();
            }

            app.UseCors(AllowSpecificOrigins);
            app.UseStaticFiles();
            app.UseClientSideBlazorFiles<Client.Startup>();

            app.UseRouting();

            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapDefaultControllerRoute();
                endpoints.MapFallbackToClientSideBlazor<Client.Startup>("index.html");
            });
        }
    }
}

控制器

namespace EssentialShopCoreBlazor.Server.Controllers
{
    [Route("essential/users/")]
    public class AccountAuthController : ControllerBase
    {

        private static UserModel LoggedOutUser = new UserModel { IsAuthenticated = false };

        private readonly UserManager<IdentityUsersModel> userManager;
        private readonly IConfiguration configuration;
        private readonly SignInManager<IdentityUsersModel> signInManager;

        public AccountAuthController(UserManager<IdentityUsersModel> _userManager, SignInManager<IdentityUsersModel> _signInManager, IConfiguration _configuration)
        {
            userManager = _userManager;
            signInManager = _signInManager;
            configuration = _configuration;
        }

        [HttpPost]
        [Route("create")]
        public async Task<ActionResult<ApplicationUserModel>> CreateUser([FromBody] ApplicationUserModel model)
        {
            var NewUser = new IdentityUsersModel
            {
                UserName = model.UserName,
                BusinessName = model.BusinessName,
                Email = model.Email,
                PhoneNumber = model.PhoneNumber
            };

            var result = await userManager.CreateAsync(NewUser, model.Password);

            if (!result.Succeeded)
            {
                var errors = result.Errors.Select(x => x.Description);
                return BadRequest(new RegistrationResult { Successful = false, Errors = errors });
            }
            return Ok(new RegistrationResult { Successful = true });
        }
}}

客户服务

  public class AuthService : IAuthService
    {
        private readonly HttpClient _httpClient;
        private readonly AuthenticationStateProvider _authenticationStateProvider;
        private readonly ILocalStorageService _localStorage;

        string BaseUrl = "https://localhost:44398/essential/users/";

        public AuthService(HttpClient httpClient,
                           AuthenticationStateProvider authenticationStateProvider,
                           ILocalStorageService localStorage)
        {
            _httpClient = httpClient;
            _authenticationStateProvider = authenticationStateProvider;
            _localStorage = localStorage;
        }

        public async Task<RegistrationResult> Register(ApplicationUserModel registerModel)
        {
            var result = await _httpClient.PostJsonAsync<RegistrationResult>(BaseUrl + "create", registerModel);

            return result;
        }
}

0 个答案:

没有答案