Кастомный Identity не обращается к /Identity/Account/Login

142
18 июля 2019, 21:50

Я пробовал разные варианты кастомного identity, даже мелкие отступления в сторону от типового решения (допустим, решил поменять тип поля для User Id на int или сделать вход в приложение не по емейлу, по логину) вызывают одну неприятную особенность в asp.net core 2.1

При указании корректного адреса для страниц login, logout (например в _LoginPartial.cshtml:

@using Microsoft.AspNetCore.Identity
@inject SignInManager<CustomUser> SignInManager
@inject UserManager<CustomUser> UserManager
@if (SignInManager.IsSignedIn(User))
{
    <form asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Action("Index", "Home", new { area = "" })" method="post" id="logoutForm" class="navbar-right">
        <ul class="nav navbar-nav navbar-right">
            <li>
                <a asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Hello @UserManager.GetUserName(User)!</a>
            </li>
            <li>
                <button type="submit" class="btn btn-link navbar-btn navbar-link">Logout</button>
            </li>
        </ul>
    </form>
}
else
{
    <ul class="nav navbar-nav navbar-right">
        <li><a asp-area="Identity" asp-page="/Account/Register">Register</a></li>
        <li><a asp-area="Identity" asp-page="/Account/Login">Login</a></li>
    </ul>
}

Ссылка почему-то отображается некорректно: вместо /Identity/Account/Login будет ссылка на /Account/Login - при этом если в браузере вбить правильный адрес, то страница логина есть.

В явном виде это в типовом решении нигде не указывается, но и при кастомизации я меняю такие места, в которых это не может настраиваться, тогда где же?

Это не в Startup.cs настройки идентити:

services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
        {
            options.Password.RequireDigit = false;
            options.Password.RequiredLength = 6;
            options.Password.RequireNonAlphanumeric = false;
            options.Password.RequireUppercase = false;
            options.Password.RequireLowercase = false;
        })
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

И это (там же) не настройки маршрутов:

routes.MapRoute(
    name: "areas",
    template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
);
routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}/{id?}");

Это не настройки \Areas\Identity\IdentityHostingStartup.cs (если он вообще есть) - там пусто:

[assembly: HostingStartup(typeof(WebApplication2.Areas.Identity.IdentityHostingStartup))]
namespace WebApplication2.Areas.Identity
{
    public class IdentityHostingStartup : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            builder.ConfigureServices((context, services) => {
            });
        }
    }
}

Тогда где же? Такое впечатление, что дефолтный identity прошивает где-то area=Identity, но где этот код и почему он слетает при кастомизации - я не понимаю.

Есть какие-то идеи?

Answer 1

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

Нужно после настроек идентити настроить заново все url для страниц входа-выхода:

services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = "/Account/Login";
    // ...
});

Это работает, хотя переопределять приходится несколько адресов, а не указывать определённую area.

Ссылки по теме:

  • Change routing in ASP.NET Core Identity UI?
Answer 2

Ну, так это понятно, вы указываете "asp-page="/Account/Manage/Index", вам и будет показывать линк - ".../Account/Manage/Index", если хотите нормальный линк, лучше сделать так

<a asp-area="Identity" asp-controller="Account" asp-action="Register">Register</a>....

И обязательно над контролером должно стоять наименование области

  [Area("Identity")]
  public class BLABLA : Controller
READ ALSO
Скорость работы алгоритма на C#

Скорость работы алгоритма на C#

Есть такая задачка простенькаяПодсчитать количество повторений строковых элементов в неотсортированных коллекциях

133
Как правильно считать время

Как правильно считать время

Есть статический класс (мой) в котором я в начале игры достаю из сервера время, как мне потом к нему прибавлять время пройденное в игре что...

143
Запрет на повторный вывод данных в Report viewer

Запрет на повторный вывод данных в Report viewer

Мне необходимо убрать дублирование шапки страницы как на скринахНа первом скрине это макет того как отчет должен выглядеть

159
Валидация модели с помощью dataannotation

Валидация модели с помощью dataannotation

Пытаюсь повесить на модель валидациюВот моя модель:

169