PasswordSignInAsync()成功之后,User.Identity.IsAuthenticated为false

dud*_*nii 5 c# asp.net authentication identity

该问题与ASP.NET Core 2.0中的身份验证有关。

之后PasswordSignInAsync()result有一个状态的成功。所以我重定向到行动ChatStaticController

    [HttpPost("login")]
    public async Task<ActionResult> Login([Bind] LoginModel lm) {

        if (!ModelState.IsValid)
            return BadRequest(ModelState);

        var result = await _signInManager.PasswordSignInAsync(lm.Username, lm.Password, false, false);

        if (result.Succeeded)
            return RedirectToAction("Login", "Static");
        else
            return BadRequest(new { message = "Invalid username or password" });
    }
Run Code Online (Sandbox Code Playgroud)

StaticController.Chat()

    [HttpGet("/chat")]
    public ActionResult Chat() {

        if (User.Identity.IsAuthenticated)
            return File("~/chat/index.html", "text/html");
        else
            return RedirectToAction("Login", "Static");
    }
Run Code Online (Sandbox Code Playgroud)

并且这里出现问题是因为User.Identity.IsAuthenticated始终为false。即使执行了Login()操作后,我从浏览器中调用localhost:5000/chat它仍然是错误的。

这些是我找到的相关解决方案,但是它们都不起作用:

该解决方案已过时。我正在使用ASP.NET Core 2.0,但UseCookieAuthentication()已过时。 PasswordSignInAsync成功后,User.Identity.IsAuthenticated始终为false

正如在此解决方案中指出的那样,在Login()操作之后调用SignInAsync之后,User.Identity.IsAuthenticated返回false,我应该再次调用Chat()方法(就像我所做的那样localhost:5000/chat),并且它应该可以工作。问题是,事实并非如此。

这是我的Startup.cs:

public class Startup
{
    public IConfiguration Configuration { get; }

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddDbContext<ApplicationDbContext>(options => {
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
        });

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.Configure<IdentityOptions>(options => {
            // Password settings
            options.Password.RequireDigit = true;
            options.Password.RequiredLength = 6;
            options.Password.RequireNonAlphanumeric = false;
            options.Password.RequireUppercase = false;
            options.Password.RequireLowercase = false;

            // User settings
            options.User.RequireUniqueEmail = true;
        });
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseStaticFiles();
        app.UseMvc();
        app.UseAuthentication();
    }
}
Run Code Online (Sandbox Code Playgroud)

请帮忙。

小智 -1

这是我的startup.cs

public class Startup
{
    public IConfiguration Configuration { get; private set; }

    public Startup(IHostingEnvironment env)
    {
        var config = new ConfigurationBuilder()
            .AddJsonFile("config.json", optional: true)
            .SetBasePath(env.ContentRootPath)
            .Build();

        Configuration = config;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.ConfigureDataContext(Configuration);

        services.AddIdentity<ApplicationUser, IdentityRole>(p =>
        {
            p.Password.RequireDigit = false;
            p.Password.RequireLowercase = false;
            p.Password.RequireUppercase = false;
            p.Password.RequireNonAlphanumeric = false;
        })
        .AddEntityFrameworkStores<MyShuttleContext>()
        .AddDefaultTokenProviders();

        services.ConfigureDependencies();
        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)
    {
        app.UseStaticFiles();
        app.UseAuthentication();
        app.ConfigureRoutes();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的 config.json

{
  "DefaultUsername": "carrier",
  "DefaultPassword": "******",
  "Data": {
    "UseInMemoryStore": "false",
    "DefaultConnection": {
      "ConnectionString": "Server=(localdb)\\MSSQLLocalDB;Database=MyShuttle;Trusted_Connection=True;MultipleActiveResultSets=true"
    }
  },
  "EntityFramework": {
    "MyShuttleContext": {
      "ConnectionStringKey": "Data:DefaultConnection:ConnectionString"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我的控制器代码与你的相同。我对这段代码没有任何问题。您可以尝试检查 SQL Server 对象资源管理器来检查表是否正确填充。