Реагирующий шаблон ASP Core 3, HttpContext.User.IsAuthenticated () возвращает False после входа в систему - PullRequest
1 голос
/ 26 сентября 2019

Проработав некоторое время над моим проектом, я выпустил HttpContext.User.IsAuthenticated(), возвращающий False после входа в систему, и мне нужно знать, где я должен искать ошибку, которую я совершил, которая стала причиной этой проблемы.Это метод Login, OnPost.

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");
    if (ModelState.IsValid)
    {
        var user = _userManager.Users.FirstOrDefault(u => u.StudentNumber == Input.StudentNumber.ToString());
        if (!(user is null) && await _userManager.CheckPasswordAsync(user, Input.Password))
            await _signInManager.SignInAsync(user, Input.RememberMe);
        var isUserAuthenticated = HttpContext.User.IsAuthenticated();
        return Redirect(returnUrl);
    }

    // If we got this far, something failed, redisplay form
    return Page();
  }

Метод ConfigureServices.

public void ConfigureServices(IServiceCollection services)
{
     services.AddAutoMapper();

     services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));

     services.AddDefaultIdentity<ApplicationUser>(option=>option.Password.RequireNonAlphanumeric=false)
                .AddEntityFrameworkStores<ApplicationDbContext>();

     services.AddIdentityServer()
                .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();

     services.AddAuthentication()
                .AddIdentityServerJwt();

     services.AddMvc(options => options.EnableEndpointRouting = false)
                .AddNewtonsoftJson();

            // In production, the React files will be served from this directory
     services.AddSpaStaticFiles(configuration =>
     {
           configuration.RootPath = "ClientApp/build";
     });
}

Метод Configure.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
   if (env.IsDevelopment())
   {
       app.UseDeveloperExceptionPage();
       app.UseDatabaseErrorPage();
   }
   else
   {
       app.UseExceptionHandler("/Error");
       // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
       app.UseHsts();
   }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseSpaStaticFiles();

    app.UseAuthentication();
    app.UseIdentityServer();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
          name: "default",
          template: "{controller}/{action=Index}/{id?}");
     });

    app.UseSpa(spa =>
    {
        spa.Options.SourcePath = "ClientApp";

        if (env.IsDevelopment())
        {
            spa.UseReactDevelopmentServer(npmScript: "start");
        }
    });
}

1 Ответ

1 голос
/ 26 сентября 2019

SignInManager.SignInAsync() создает cookie только для данного пользователя.Этот метод не установит HttpContext.User.

Но в следующем запросе, который имеет cookie, вы можете получить доступ к HttpContext.User после AuthenticationMiddleware и HttpContext.User.IsAuthenticated() должно быть true.

AuthenticationMiddleware всегда пытайтесь аутентифицировать пользователя по схеме по умолчанию, и поскольку у вас AddIdentityServer после AddDefaultIdentity, сервер идентификации становится вашей схемой по умолчанию, но когда вы вызываете SignInManager.SignInAsync, запускается схема Identity.

Подводя итог, с этой конфигурацией ваш AuthenticationMiddleware всегда пытается аутентифицировать запрос на IdentityServer, и если вы хотите использовать другую схему apis, вы должны использовать [Authorize(AuthenticationSchemes = "Identity.Application")].

PS Identity.Application - схема аутентификации для удостоверения ASP.NET

...