繁体   English   中英

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

[英]User.Identity.IsAuthenticated is false after PasswordSignInAsync() succeeded

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

PasswordSignInAsync()result的状态为成功。 所以我正在重定向到StaticController操作Chat

    [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" });
    }

静态控制器.Chat()

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

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

在这里出现问题是因为 User.Identity.IsAuthenticated 总是假的。 即使在执行 Login() 操作后我从浏览器localhost:5000/chat调用它仍然是错误的。

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

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

正如此解决方案中所述, User.Identity.IsAuthenticated在 Login() 操作后调用 SignInAsync返回 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();
    }
}

请帮忙。

这是我的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();
    }
}

这是我的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"
    }
  }
}

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

据我所知, User.Identity.IsAuthenticated仅在您的控制器(或您的操作)使用[Authorize]属性进行修饰时才为真。 所以在这里:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM