Управление состоянием аутентификации пользователя при ручной навигации по URL

Я использую Angular2 с ASP.NET Core MVC, и управление ручной навигацией по URL работает нормально, сервер успешно загружает мое домашнее представление с Angular2.

При аутентификации пользователя я настраиваю переменную сеанса следующим образом:

HttpHelper.HttpContext.Session.SetString("isLoggedIn", true.ToString() );

Что я хочу, так это то, что после того, как пользователь находится в приложении, если он хочет загрузить определенный маршрут, перейдя к нему вручную, я хочу, чтобы моя служба вызывала мой ASP-контроллер, чтобы проверить, прошел ли пользователь уже аутентификацию, чтобы моя защита позволяла маршрутизация. Вместо этого для защиты по умолчанию установлено значение false, и я, очевидно, перенаправляюсь на свою страницу входа.

Вот мой метод контроллера ASP, который я хочу вызвать, чтобы обновить значение IsLoggedIn в моем auth.service:

[HttpGet]
public IActionResult IsConnectedState()
{
    if (!String.IsNullOrWhiteSpace(HttpHelper.HttpContext.Session.GetString("isLoggedIn")))
        return Ok(true);
    else
        return Ok(false);
}

так что мой AuthenticationGuard может вызвать AuthenticationService для обновления логического значения, управляющего аутентифицированным состоянием:

alert(this.authService.isLoggedIn);
if (!this.authService.isLoggedIn) {
    this.authService.setupLoggedInState().subscribe(() => { });
}

со следующим кодом, обновляющим логическое значение в моем auth.service :

setupLoggedInState() {
    alert("Setting Up");

    // Setting up the Http call 
    let lControllerAction: string = "/IsConnectedState";
    let lControllerFullURL: string = this.controllerURL + lControllerAction;
    let headers = new Headers({ 'Content-Type': 'application/json' });
    let options = new RequestOptions({ headers: headers });

    // Call my ASP Controller IsConnectedState() method
    return this.http.get(lControllerFullURL, options)
        .map((res: any) => {
            // Réponse reçue du WebService
            let data = res.json();
            alert(data);
            if (data == true) {
                this.isLoggedIn = true;
            }
        }
        ).catch(this.handleError);
}

Когда я выполняю аутентификацию, а затем вручную перехожу к URL-адресу, мой охранник сообщает мне, что логическое значение действительно установлено на «ложь», и я также получаю «Настройка», когда моя служба пытается вызвать http.get. Кажется, ошибка в середине метода, потому что я никогда не добираюсь до точки останова, которую я установил в своем ASP-контроллере. Я получаю следующую ошибку, которую я не понимаю:

"platform-browser.umd.js:937 EXCEPTION: Error: Uncaught (in promise): TypeError: Cannot read property 'toString' of null"

Может ли это быть из-за того, что я не вызываю службу в нужный момент в моем auth.guard? Все мои другие вызовы, такие как аутентификация, работают с http.post без каких-либо проблем, поэтому я действительно не понимаю, откуда возникает проблема...

Любая помощь будет принята с благодарностью.


person Alex Beugnet    schedule 25.08.2016    source источник


Ответы (1)


В Angular 2 RC5 есть известный дефект, который вызывает эту ошибку, когда вы делаете get и предоставляете заголовок 'Content-Type': 'application/json'.

В качестве временного обходного пути добавьте пустую строку в свойство body в параметрах запроса:

let options = new RequestOptions({ headers: headers, body: "" });
person StriplingWarrior    schedule 25.08.2016
comment
Спасибо, это действительно была проблема ... Теперь вызов работает, но я думаю, что уже слишком поздно, потому что я попадаю в ASP.Controller после перенаправления на логин, а это не то поведение, которое я хочу. В любом случае, это теперь другая проблема. Большое спасибо ! - person Alex Beugnet; 25.08.2016