剃刀组件认证

时间:2019-03-28 21:31:53

标签: c# asp.net authentication razor-components

如何将身份验证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.

这是在其中实施登录的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,没有办法调用身份验证请求吗?

1 个答案:

答案 0 :(得分:1)

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

即使使用单独的auth创建新的服务器端项目时获得的预制登录也使用 Login.cshtml

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

enter image description here

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

旁注:使用.cshtml登录时出现了奇怪的双重渲染,方法是替换 _Host.cshtml

中的以下行来解决
@(await Html.RenderComponentAsync<App>(RenderMode.ServerPrerendered)

使用

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

请参阅: