Blazor Blazer服务器端&x2B;AspNetCore.Identity

Blazor Blazer服务器端&x2B;AspNetCore.Identity,blazor,blazor-server-side,Blazor,Blazor Server Side,如何在Blazor服务器端实现身份验证(Razor组件)。我正在使用.NET3预览版5。我目前正在使用AspNetCore.Identity。注册用户工作正常,但调用任何SignIn方法都会导致异常(响应已启动) 这里有一些代码——它是唯一的玩具/原型,所以有点混乱/混乱。一旦我向自己证明它实际上可以使用Identity和Blazor服务器端,我就会重写 @page "/signup" @using System.Security.Claims @using AuthProto.Data @us

如何在Blazor服务器端实现身份验证(Razor组件)。我正在使用.NET3预览版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);
    }
}

@page”/signup
@使用System.Security.Claims
@使用AuthProto.Data
@使用AuthProto.Entities
@使用Microsoft.AspNetCore.Authentication
@使用Microsoft.AspNetCore.Authentication.Cookies
@使用Microsoft.AspNetCore.Http
@使用Microsoft.AspNetCore.Http.Extensions
@使用Microsoft.AspNetCore.Identity
@使用Microsoft.AspNetCore.Identity.EntityFrameworkCore
@注入天气预报服务预报服务
@注入SignInManager SignInManager
@注入用户管理器用户管理器
@注入UserDb;
报名
@信息
提交
登录
提交
@功能{
私有SignupApi数据=新的SignupApi();
private LoginApi login=new LoginApi();
私有字符串消息;
天气预报[]预报;
受保护的重写异步任务OnInitAsync()
{
Forecast=await ForecastService.GetForecastSync(DateTime.Now);
}
私人无效手册提交()
{
var user=new-AppUser(){Email=data.Email,UserName=data.Email};
IdentityResult result=UserManager.CreateAsync(user,data.Password).result;
if(result.successed)
{
message=string.Format(“成功创建了用户{0}!”,User.UserName);
//var signInResult=SignInManager.PasswordSignInAsync(
//用户,数据。密码,false,false)。结果;
}
其他的
{
message=result.Errors.FirstOrDefault()?.Description;
}
}
私有异步void HandleLogin()
{
var x=db.Users.SingleOrDefault(u=>u.Email==data.Email);
var result=SignInManager.CheckPasswordSignInAsync(x,data.Password,true).result;
等待SignInManager.SignInAsync(x,true);
}
}
我还尝试使用HttpAssessor手动访问HttpContext.SigninAsync-没有异常,但没有设置cookie


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

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

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

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

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