Ядро ASP.NET с Blazor: невозможно определить подлинность cookie - PullRequest
3 голосов
/ 20 марта 2019

Я пытался следовать этому руководству (http://lightswitchhelpwebsite.com/Blog/tabid/61/EntryId/4316/A-Demonstration-of-Simple-Server-side-Blazor-Cookie-Authentication.aspx), чтобы иметь возможность создать приложение с аутентификацией cookie с помощью ASP.NET Core 3.0 и платформы Blazor v.0.9.0 (последняя версия). Для IDE я используя VS 2019 Preview.

Автор использует более раннюю версию Blazor, но я следовал руководству, используя клиентский проект вместо App, так как они делают одно и то же, я думаю, просто по-разному вызывались в другой версии Blazor.

Вот ссылка на репо с моим результатом: https://github.com/SaintMSent/TestBlazorCookieAuth

Проблема в том, что это не работает. Если я захожу на страницу localhost: port / login, создается cookie (я проверял инструменты Chrome dev). И если я иду на страницу выхода из системы, она удаляется, так что эта часть в порядке. Но другие страницы приложения не будут загружаться. Если я удаляю компонент Login из MainLayout, все загружается нормально, поэтому я думаю, что проблема в HttpContext и HttpContextAccessor в Login.cshtml

enter image description here

Вот как выглядит Login.cshtml

@using System.Security.Claims
@using Microsoft.AspNetCore.Http
@page "/login"
@inject IHttpContextAccessor _httpContextAccessor
@inject HttpClient Http
@if (User.Identity.Name != null)
{
    <b>You are logged in as: @User.Identity.Name</b> 
    <a class="ml-md-auto btn btn-primary" 
       href="/logout?returnUrl=/" 
       target="_top">Logout</a>
}
else
{
    <a class="ml-md-auto btn btn-primary" 
       href="/login?returnUrl=/" 
       target="_top">Login</a>
}
@functions {
    private ClaimsPrincipal User;
    protected override void OnInit()
    {
        base.OnInit();
        try
        {
    // Set the user to determine if they are logged in
            User = _httpContextAccessor.HttpContext.User;
        }
        catch { }
    }
}

Пожалуйста, помогите мне выяснить, что здесь происходит. Я надеюсь, что предоставил достаточно деталей, спасибо.

ОБНОВЛЕНИЕ: если я добавлю эту строку

        services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

в Startup.cs в клиентском проекте, все загружается, но _httpContextAccessor.HttpContext.User всегда равен нулю

Ответы [ 2 ]

0 голосов
/ 28 апреля 2019

Я решил это странным способом.Я создал контроллер с именем AuthController и добавил к нему эти методы

    [Route("api/[controller]")]
    public class AuthController : Controller
    {
        [HttpGet]
        [Route("getlogin")]
        public string GetLogin()
        {
            if (User.Identity.IsAuthenticated)
            {
                return $"{User.Identity.Name}";
            }

            return string.Empty;
        }

        [HttpGet]
        [Route("getrole")]
        public string GetRole()
        {
            if (User.Identity.IsAuthenticated)
            {
                if (User.IsInRole("Admin"))
                {
                    return "Admin";
                }

                return "User";
            }

            return string.Empty;
        }
    }

И затем я вызываю API со стороны клиента, и он прекрасно работает для меня

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

Попробуйте сделать это:

Добавьте следующее в Blazor.Web.App.Startup.cs:

services.AddHttpContextAccessor();

Вам также нужно это в <component-name>.cshtml

@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor httpContextAccessor

Изменить: Вы также должны удалить следующее с вашего сервера. Запуск

 // As I've said above, add this to your Client.Startup, and not to the Server.Startup, though at the end of the day it's the same pipeline.
  services.AddHttpContextAccessor();
  // I'm not sure what is this for. Remove it :)
  services.AddScoped<HttpContextAccessor>();
  // This is used with Http Client Factory, right now is not supported in client-side blazor; requires some configuration; and in any case an HttpClient object is automatically created for you. 
  services.AddHttpClient();
  // Once again, superfluous, the HttpClient created for you is Singleton
  services.AddScoped<HttpClient>();
...