【问题标题】:Blazer Server Side + AspNetCore.IdentityBlazor 服务器端 + Asp Net Core.Identity
【发布时间】:2019-10-06 01:10:44
【问题描述】:

如何在 Blazor 服务器端(Razor 组件)中实现身份验证。我正在使用 .net 3 preview 5。我目前正在使用 AspNetCore.Identity。注册用户工作正常,但调用任何 SignIn 方法都会导致异常(响应已启动)。

这里有一些代码 - 它是唯一的玩具/原型,所以它有点混乱/破解在一起。一旦我向自己证明它实际上可以使用 Identity 和 Blazor 服务器端,就会重写!

@page "/signup"
@using System.Security.Claims
@using AuthProto.Data
@using AuthProto.Entities
@using Microsoft.AspNetCore.Authentication
@using Microsoft.AspNetCore.Authentication.Cookies
@using Microsoft.AspNetCore.Http
@using Microsoft.AspNetCore.Http.Extensions
@using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.Identity.EntityFrameworkCore
@inject WeatherForecastService ForecastService
@inject SignInManager<AppUser> SignInManager
@inject UserManager<AppUser> UserManager
@inject UserDb db;
<h1>Signup</h1>

<h2>@message</h2>
<EditForm Model="@data" OnValidSubmit="@HandleValidSubmit">
    <DataAnnotationsValidator />
    <ValidationSummary />

    <InputText id="name" bind-Value="@data.Email" />
    <InputText id="password" bind-Value="@data.Password" />

    <button type="submit">Submit</button>
</EditForm>
<h2>Login</h2>
<EditForm Model="@login" OnValidSubmit="@HandleLogin">
    <DataAnnotationsValidator />
    <ValidationSummary />

    <InputText id="name" bind-Value="@login.email" />
    <InputText id="password" bind-Value="@login.password" />

    <button type="submit">Submit</button>
</EditForm>

@functions {

    private SignupApi data = new SignupApi();
    private LoginApi login = new LoginApi();
    private string message;

    WeatherForecast[] forecasts;

    protected override async Task OnInitAsync()
    {
        forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
    }

    private void HandleValidSubmit()
    {
        var user = new AppUser() { Email = data.Email, UserName = data.Email };
        IdentityResult result = UserManager.CreateAsync(user, data.Password).Result;

        if (result.Succeeded)
        {
            message = string.Format("User {0} was created successfully!", user.UserName);

            //   var signInResult = SignInManager.PasswordSignInAsync(
            //     user, data.Password, false, false).Result;
        }
        else
        {
            message = result.Errors.FirstOrDefault()?.Description;
        }
    }

    private async void HandleLogin()
    {
        var x = db.Users.SingleOrDefault(u => u.Email == data.Email);

        var result = SignInManager.CheckPasswordSignInAsync(x, data.Password, true).Result;
        await SignInManager.SignInAsync(x, true);
    }
}

我也尝试过使用 HttpAssessor 手动访问 HttpContext.SigninAsync - 没有例外,但没有设置 cookie。

我猜问题是 Identity 当前与 Blazor 服务器端不兼容,并且 SignIn 方法因此类似于启动响应,然后在稍后的调用中添加到它。我认为这会导致 SignalR 与客户端的通信出现问题。

【问题讨论】:

  • 您的问题包罗万象……您应该提出具体问题。例如...请参阅您之前的问题,我在回答之前已经引用了该问题。并且你的问题的标题应该是问题的形式......
  • 将尝试更具体,但一个挑战是没有足够的信息来提出正确的问题。例如,我不清楚使用 Identity 是否是合适的解决方案。所以我的问题有两个:1)aspnet identity 是正确的方法,2)如果是,我该如何克服这个异常..
  • 登录用户从哪里来?他们在哪里登录?
  • 身份验证发生在 Blazor 服务器端应用程序中。目前,我正在使用 AspNetCore.Identity 提供在 Blazor 服务器端应用程序中实现的用户管理和身份验证,以处理注册和登录。在这个模型中,我创建了一个玩具 blazor 页面来处理这两个操作(请参阅相关代码)。但是,设置登录并尝试设置身份验证 cookie 会导致异常(请求已启动)。我不清楚我是否遗漏了某些东西,或者 Identity 是否一开始就不是正确的方法。
  • 我不希望这会起作用:AspNetCore.Identity 是为(围绕)HTTP 请求/响应模型而构建的。但是 Blazor 没有在 HTTP 上运行,设置 cookie 没有意义。您或许可以使用 Identity 的某些部分,但不能使用 SignIn。

标签: blazor blazor-server-side


【解决方案1】:

身份包含在 Blazor 项目模型中,因此我认为这是进行身份验证的好方法。因此,您仍然需要一个 C# 类 SignInManager 来提供您的身份验证行为(必须在 Startup.cs 文件中的 ConfigureService 方法中设置) 由于它继承自 SignInManager 接口,因此它具有对应于 HttpContext 的 Context 属性。它可用于携带 ClaimsPrincipal 和 cookie 详细信息。不过对于 cookie,您需要在 Startup.cs 中添加良好的服务:

service.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme);

Startup.cs exemple 我用它来创建一个新的应用程序,其中数据库不用于身份验证,它可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-03
    • 2020-06-22
    • 2021-05-28
    • 2020-05-15
    • 2019-02-20
    • 1970-01-01
    • 2020-09-19
    • 2020-04-14
    相关资源
    最近更新 更多