Asp.net登录页面-无法使用PasswordSignInAsync登录

时间:2020-04-26 19:57:15

标签: asp.net-core asp.net-identity blazor blazor-server-side

我试图在Blazor应用程序中创建自己的登录页面。有一个选项可以使用默认的注册/登录页面,但决定使它们成为Blazor组件。

问题是当我尝试登录时,方法PasswordSignInAsync()才开始运行,什么也没发生。没有例外,没有警告,没有错误消息。我总是在后续方法上设置一个断点,但是无论我等待多长时间,它都不会被击中。我的代码:

Index.razor

@page "/"
@using  Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> Manager
@inject UserManager<IdentityUser> UserManager

@if (!IsLoginSuccessful)
{
    <div>
        <input type="text" @bind-value="@Email" />
        <input type="password" @bind-value="@Password" />

        <button @onclick="@PerformLogin">LogIn</button>
    </div>
}
else
{
    <p>You have successfully logged in!</p>
}


@code {
    public string Email { get; set; }
    public string Password { get; set; }
    public bool IsLoginSuccessful { get; set; } = false;

    public async Task PerformLogin()
    {
        var user = await UserManager.FindByEmailAsync(Email);
        var check = await Manager.CheckPasswordSignInAsync(user, Password, false);
        var result = await Manager.PasswordSignInAsync(Email, Password, false, false);

        if (result.Succeeded)
        {
            IsLoginSuccessful = true;
        }
    }
}

Startup.cs

       public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));
            services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = false)
                .AddEntityFrameworkStores<ApplicationDbContext>();

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

                // Lockout settings.
                options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
                options.Lockout.MaxFailedAccessAttempts = 5;
                options.Lockout.AllowedForNewUsers = true;

                // User settings.
                options.User.AllowedUserNameCharacters =
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
                options.User.RequireUniqueEmail = false;
            });

            services.AddRazorPages();
            services.AddServerSideBlazor();
            services.AddScoped<AuthenticationStateProvider, RevalidatingIdentityAuthenticationStateProvider<IdentityUser>>();
(... my other DI methods)

有什么方法可以确定为什么此任务从未完成?当我使用这些默认视图时,登录过程会顺利进行,因此我认为它与密码哈希或电子邮件/用户名无关 表格。

该任务真正完成(和失败)的唯一时刻是当我用整个“ user”对象替换了“ Email”参数时。

编辑:我设法从浏览器控制台检索到此错误:

Error: System.InvalidOperationException: The response headers cannot be modified because the response has already started.
(...)

我仍然不知道为什么会出现这种情况,因为没有运行修改标头的过程。

2 个答案:

答案 0 :(得分:0)

不幸的是,SignInManager在剃须刀页面中无法使用,
您必须在.cshtml页面(而不是.razor)中编写登录代码(以及需要与SignInManager一起使用的所有其他页面,例如ChangePassword,LogOut)。
然后,您可以重定向到根目录页面

答案 1 :(得分:0)

我有类似的问题。我已经使用VS的身份验证模板创建了blazor项目。我在blazor应用程序中不喜欢cshtml页面。由于blazor wasm是SPA框架,因此您可以轻松调用以首选语言编写的API。

例如,我使用了带有JWT身份验证的.net核心API。这种方法易于实现,并且您可以随时切换后端框架。 下面的链接可能有帮助。

blazorboilerplate

additional_resources

相关问题