Написание Cook ie при успешной подаче в приложении Blazor - PullRequest
0 голосов
/ 22 марта 2020

У меня есть страница входа, которая позволяет пользователю войти в систему. В событии HandlieValidSubmit() я проверяю, совпадают ли имя пользователя и пароль со значением, хранящимся в базе данных.

Если все в порядке, я хочу сохранить некоторые данные в usercook ie перед перенаправлением на другой сайт. Это 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}");
        }
    }
}

Cook ie устанавливается из функции входа в систему и выглядит так:

   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" - way.

Когда я пытаюсь написать cook ie, я получаю сообщение об ошибке:

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

Я понимаю, что эта ошибка хочет сказать мне. Увы, я действительно не знаю, как это предотвратить. Я ожидал, что в этот момент ответ вообще не должен был начинаться.

Есть ли другое событие, кроме HandleValidSubmit(), которое мне нужно использовать вместо этого? Или я могу просто очистить Ответ перед тем, как написать повара ie без побочных эффектов?

1 Ответ

2 голосов
/ 23 марта 2020

Blazor Server App - это приложение на основе веб-сокета, а не на основе HTTP, поэтому служба HttpContext недоступна.

При создании приложения Blazor Server с поддержкой IdentityUI вы получаете шаблон по умолчанию компонент (AuthorizeView), который позволяет входить и выходить из системы. Когда вы нажимаете кнопку «Войти», вы попадаете на страницу входа, где вы можете ввести свои учетные данные. Страница входа на самом деле является страницей Razor, а не частью приложения Blazor. Это означает, что вы больше не находитесь в сфере Blazor, а здесь, в этой новой области (странице Razor), доступен HttpContext, вы даже не можете должен использовать HttpContextAccessor, так как HttpContext предоставляется как свойство в объекте PageModel. После входа пользователя в систему, создания файлов cookie и т. Д. c. Он перенаправляется в Blazor.

Вот как вы можете это сделать. Просто подражайте этой процедуре ... Создайте страницу Razor, где вы можете делать все это. Вы также можете передать возвращаемый URL-адрес, чтобы вы были перенаправлены на указанную c страницу компонента вместо страницы компонента индекса.

Примечание: HandleValidSubmit () - это метод, который вызывается, если ваш элементы компонентов формы прошли валидацию. Это не имеет ничего общего с рассматриваемой проблемой.

Примечание. Чтобы использовать метод NavigationManger.NavigateTo для перехода к внешнему расположению (вне области приложения Blazor), добавьте второй логический параметр со значением true. .

Примечание: Это может помочь вам справиться с ситуацией . Есть также много ответов, связанных с текущей темой и аутентификацией с помощью OpenID Connect, Okta, IdentityUI, et c. Просто ищите их, если вам это нужно.

Примечание. Известно ли вам, что вы можете хранить данные в локальном хранилище и хранилище сеансов?

Надеюсь, это поможет ...

...