0

如何将身份验证 SignInAsync 用作来自剃须刀组件的调用。由于上下文处于管道的后期状态,它似乎会引发一些错误。

调用 HttpContext.SignInAsync 时出错:

System.AggregateException: 'One or more errors occurred. (The response headers cannot be modified because the response has already started.)'    
InvalidOperationException: The response headers cannot be modified because the response has already started.

这是实现 SignIn 的 UserState.cs。

public class UserState
{

    readonly IHttpContextAccessor Context;

    public UserState(IHttpContextAccessor Context)
    {
        this.Context = Context;
    }

    public string DisplayName { get; set; }

    public ClaimsPrincipal User => Context.HttpContext.User;

    public bool IsLoggedIn => User?.Identity.IsAuthenticated ?? false;

    public void SignIn()
    {
        var claims = new List<Claim> {
            new Claim(ClaimTypes.Name, "Bob", ClaimValueTypes.String),
            new Claim(ClaimTypes.Surname, "Builder", ClaimValueTypes.String),
        };
        var userIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
        var userPrincipal = new ClaimsPrincipal(userIdentity);

        Context.HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, userPrincipal,
            new AuthenticationProperties
            {
                ExpiresUtc = DateTime.UtcNow.AddMinutes(20),
                IsPersistent = true,
                AllowRefresh = true
            }).Wait();
    }
}

方法被调用并注入如下:

@page "/"
@inject UserState User

@if (User.IsLoggedIn)
{
   <p>You are logged in</p>
} else {
  <p>You are NOT logged in</p>
}

<button onclick="@User.SignIn">Login</button>

有没有办法登录获得成功响应,然后从 SignIn 方法刷新页面。

我见过一些使用 MVC 控制器的类似实现。不涉及 mvc 就没有办法调用身份验证请求吗?

4

1 回答 1

1

我绝对不是这个话题的天才,但我相当肯定在 .razor 组件中登录是不可能的(除非可能使用 Javascript??),必须使用 .cshtml 之类的东西。

即使您在使用个人身份验证创建新服务器端项目时获得的预制登录名也使用Login.cshtml

-> 右键单击​​项目 -> 添加 -> 新建脚手架项目... -> AddIdentity -> 全选 -> 添加

在此处输入图像描述

服务器端 Blazor 基本上是向客户端发送 html,当您实际在服务器上工作时(据我所知,仅使用 html 设置 cookie 是不可能的?),我可以在一定程度上看到登录/设置 cookie 是一个问题。但是我找不到任何解释,我或多或少在猜测:(

旁注:使用 .cshtml 登录时出现奇怪的双重渲染,通过替换_Host.cshtml中的以下行来解决

@(await Html.RenderComponentAsync<App>(RenderMode.ServerPrerendered)

@(await Html.RenderComponentAsync<App>(RenderMode.Server)

看:

于 2020-05-18T07:58:05.673 回答