【问题标题】:Writing Cookie on successful submit in Blazor Application在 Blazor 应用程序中成功提交时写入 Cookie
【发布时间】:2020-07-03 06:36:08
【问题描述】:

我有一个允许用户登录的登录页面。在HandlieValidSubmit() 事件中,我检查用户名和密码是否与存储在数据库中的值匹配。

如果一切正常,我想在重定向到另一个站点之前将一些数据存储到 usercookie 中。这是 html/blazor 代码:

<EditForm>
<!-- standard form-controls here -->
</EditForm>
@code {
    private Models.LoginUser _loginUser = new Models.LoginUser();
    private EditContext _editContext;

    private void HandleValidSubmit()
    {
        if (UserApi.Login(_loginUser.Mail, _loginUser.Password, out string error, out Guid? guid))
        {
            NaviationManager.NavigateTo($"/manage/{guid}");
        }
    }
}

Cookie 是在 Login-Function 中设置的,如下所示:

   public  DateTime SetCookie<T>(T data, TimeSpan expiration, bool httpOnly = true, bool secure = true)
        {
            DateTime expireDate = DateTime.Now.Add(expiration);
            if (data == null) return DateTime.Now;
            Type dataType = typeof(T);
            var response = _httpContextAccessor.HttpContext.Response;
            CookieOptions cookieOptions = new CookieOptions
            {
                HttpOnly = httpOnly,
                Secure = secure,
                Expires = expireDate
            };

            foreach (var property in dataType.GetProperties())
            {
                var storeInCookieAttribute = property.GetCustomAttribute<StoreInCookieAttribute>();
                if (storeInCookieAttribute == null) continue;
                response.Cookies.Append(BuildCookieKey(dataType.Name, property.Name), property.GetValue(data) as string, cookieOptions);
            }

            return expireDate;
        }

恕我直言,这是标准的“how-to-write-cookies-in-netcore” - 方式。

当我尝试写入 cookie 时收到错误消息:

“无法修改响应标头,因为响应已经开始。”

我明白这个错误想告诉我什么。唉,我真的不知道如何防止这种情况。我预计此时响应根本不应该开始。

除了HandleValidSubmit(),我还需要使用其他事件吗?或者我可以在写入 cookie 之前清除 Response 而不会产生不良副作用吗?

【问题讨论】:

  • SetCookie 在代码中调用这个方法的地方!

标签: c# asp.net-core blazor


【解决方案1】:

Blazor Server App 是基于 websocket 的应用程序,不是基于 HTTP 的应用程序,因此 HttpContext 服务不可用。

当您创建支持 IdentityUI 的 Blazor 服务器应用程序时,您会在默认模板中获得一个启用登录和注销的组件 ( AuthorizeView )。当您单击“登录”按钮时,您将被重定向到登录页面,您可以在其中输入您的凭据。登录页面实际上是一个 Razor 页面,而不是 Blazor 应用程序的一部分,这意味着您不再处于 Blazor 领域,而在这个新领域(The Razor Page)中,HttpContext 可用,您甚至没有必须使用 HttpContextAccessor,因为 HttpContext 作为 PageModel 对象中的属性提供。在用户登录、创建 cookie 等之后,他被重定向到 Blazor。

这就是你可以做到的。只需模拟此过程...创建一个 Razor 页面,您可以在其中执行所有这些操作。您还可以传递一个返回 url,这样您将被重定向到特定的组件页面,而不是索引组件页面。

注意:HandleValidSubmit() 是一个在表单组件元素通过验证时调用的方法。它与所讨论的问题无关。

注意:要使用 NavigationManger.NavigateTo 方法导航到外部位置(Blazor 应用领域之外),请添加第二个值为 true 的布尔参数。

注意:This may help you how to cope 。还有很多与当前主题和 OpenID Connect、Okta、IdentityUI 等身份验证相关的答案。如果您有需要,请自行查找。

注意:您是否知道可以将数据存储在本地存储和会话存储中?

希望这会有所帮助...

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 2013-10-19
    • 2020-09-15
    • 1970-01-01
    相关资源
    最近更新 更多