Blazor: Перенаправить на страницу входа в систему, если нет сеанса / токена JWT? - PullRequest
2 голосов
/ 28 марта 2019

Я пытаюсь создать новое приложение в Blazor и работаю над аутентификацией. Я использую токены JWT, которые хранятся в локальном хранилище. Когда приложение загружается, мне нужно проверить, есть ли токен в хранилище. Если это так, добавьте его в заголовки HTTP для всех запросов API, если нет, то перенаправьте на страницу входа до загрузки страницы ....... где я могу это сделать? Есть несколько страниц, которые нуждаются в этой проверке, поэтому это нужно сделать в одном месте, чтобы охватить все. Это должно быть сделано при запуске?

Поиск не дал решения, и, поскольку я новичок в Blazor, найти правильные условия поиска немного сложно:)

Ответы [ 3 ]

2 голосов
/ 28 марта 2019

Я сделал для этого свой собственный http-сервис.

Он называется Backend и имеет свойство для токена, например:

    public string ApiToken
    {
        get
        {
            if (!string.IsNullOrEmpty(apitoken))
                return apitoken;

            apitoken = Browser.ReadStorage("apitoken");
            return apitoken;
        }

        set
        {
            Browser.WriteStorage("apitoken", value);
        }
    }

И затем в этомКласс реализует все методы, которые есть у класса http, при внедрении вашего токена.например:

    public async Task<T> GetJsonAsync<T>(string uri)
    {
            this.InProgress = true;
            var result = await http.GetJsonAsync<ServerResult<T>>(uri, this.ApiToken);
            this.InProgress = false;

            if (!result.Success)
            {
                BlazorExtensions.Browser.Alert($"Error: {result.ErrorMessage}");
                return default(T);
            }

            return result.ValueObject;

    }

И везде используйте бэкэнд-сервис для выполнения ваших запросов.Также удобно для вашего api url.

EDIT Для части перенаправления: для краткости я пропустил эту часть, но это полный метод:

    public async Task<T> GetJsonAsync<T>(string uri)
    {
        try
        {
            this.InProgress = true;
            var result = await http.GetJsonAsync<ServerResult<T>>(uri, this.ApiToken);
            this.InProgress = false;

            if (!result.Success)
            {
                BlazorExtensions.Browser.Alert($"Error: {result.ErrorMessage}");
                return default(T);
            }

            return result.ValueObject;
        }
        catch (UnauthorizedAccessException)
        {
            this.InProgress = false;
            uriHelper.NavigateTo("/bzr/Logon");
            return default(T);
        }
        catch (Exception e)
        {
            BlazorExtensions.Browser.Alert($"Fout bij http fetch: {e.Message}");
            this.InProgress = false;
            return default(T);
        }
    }

uriHelper просто вводится в конструктор:

    public IUriHelper uriHelper { get; private set; }

    public Backend(HttpClient httpInstance, IUriHelper uriHelper)
    {
        http = httpInstance;
        this.uriHelper = uriHelper;

Угадайте, что вам нужно?

1 голос
/ 28 марта 2019

Что вы имеете в виду Startup?Класс Startup, верно?

Прямо сейчас в инфраструктуре Razor Components нет циклов событий приложения.Будьте терпеливы ... это идет ... Между тем, ради обучения используйте циклы событий Компоненты.Как правило, вы должны хранить ваш JWT в локальном хранилище, включая данные о пользователе, был ли он аутентифицирован и т.Вы можете позвонить в эту службу всякий раз, когда необходима аутентификация (или авторизация).

Кстати, вы не хотите останавливать процесс ..., говоря "before the page loads".Вы просто подразумеваете, что не хотите, чтобы «Страница нового профиля», например, на сайте онлайн-знакомств, отображалась, если пользователь не аутентифицирован, верно?Хорошо, в этом случае вызовите локальную службу аутентификации (которая извлекает данные из локального хранилища) со страницы (Компонент) методами OnInit или OnInitAsync.

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

0 голосов
/ 29 марта 2019

Решение (пока не самое лучшее, как мне кажется?) Состоит в создании базового класса для всех компонентных страниц, которые наследуются и переопределяют метод OnInit для выполнения проверок и перенаправлений.Это также работает при переходе по ссылке после загрузки приложения.

Проверка в компоненте app.cshtml работает только при начальном запуске, а не при навигации внутри приложения.Это было бы хорошо для других проверок, но не для защиты маршрутов.

...