Как создать cookie-файл на стороне клиента с помощью Blazor? - PullRequest
0 голосов
/ 03 января 2019

У меня есть страница входа, которая отправляется на сервер, получает кучу данных, затем я хочу взять некоторые из этих данных и сохранить их в cookie-файле с помощью Blazor на клиенте.

Итак, для начала я успешно ввел IHttpContextAccessor. и на данный момент в моей функции Blazor у меня есть:

httpContextAccessor.HttpContext.Response.Cookies.Append("test", "ddd");

в отладке, когда я нажимаю на приведенную выше строку кода, ошибки с:

"Заголовки доступны только для чтения, ответ уже начался."

Конечно, я не буду сохранять «test» с «ddd» в cookie, я просто пытаюсь получить cookie для сохранения.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вы можете создать серверный метод, подобный этому, чтобы установить cookie:

    public async Task<IActionResult> OnPostAsync(string returnUrl = null)
    {
        returnUrl = returnUrl ?? Url.Content("~/");

        // *** !!! This is where you would validate the user !!! ***
        // In this example we just log the user in

        // (Always log the user in for this demo)
        var claims = new List<Claim>
            {
                new Claim(ClaimTypes.Name, Input.Email),
                new Claim(ClaimTypes.Role, "Administrator"),
            };

        var claimsIdentity = new ClaimsIdentity(
            claims, CookieAuthenticationDefaults.AuthenticationScheme);

        var authProperties = new AuthenticationProperties
        {
            IsPersistent = true,
            RedirectUri = this.Request.Host.Value
        };

        try
        {
            await HttpContext.SignInAsync(
            CookieAuthenticationDefaults.AuthenticationScheme,
            new ClaimsPrincipal(claimsIdentity),
            authProperties);

            return LocalRedirect(returnUrl);
        }
        catch 
        {
            return Page();
        }
    }

См .: Демонстрация простой серверной аутентификации Blazor Cookie

0 голосов
/ 03 января 2019

Вам нужно будет использовать JS interop:

        public async static Task WriteCookieAsync(string name, string value, int days)
        {
           var test = await JSRuntime.Current.InvokeAsync<object>("blazorExtensions.WriteCookie", name, value, days);
        }

Начиная с ASP.NET Core 3.0.0-preview3 ( [Обсуждение] Microsoft.Interop.JSRuntime.Current был удален ), свойство Current недоступно, поэтому используйте следующий код:

var test = await JSRuntime.InvokeAsync<string>("blazorExtensions.WriteCookie", name, value, days);

Не забудьте ввести IJSRuntime вверху:

@inject IJSRuntime JSRuntime

А это JS:

window.blazorExtensions = {

WriteCookie: function (name, value, days) {

    var expires;
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        expires = "; expires=" + date.toGMTString();
    }
    else {
        expires = "";
    }
    document.cookie = name + "=" + value + expires + "; path=/";
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...