Я пробовал разные варианты кастомного 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, но где этот код и почему он слетает при кастомизации - я не понимаю.
Есть какие-то идеи?
Я в общем, так и не понял, где это настраивается, оставлю промежуточный результат для практического применения.
Нужно после настроек идентити настроить заново все url для страниц входа-выхода:
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = "/Account/Login";
// ...
});
Это работает, хотя переопределять приходится несколько адресов, а не указывать определённую area.
Ссылки по теме:
Ну, так это понятно, вы указываете "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
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть такая задачка простенькаяПодсчитать количество повторений строковых элементов в неотсортированных коллекциях
Есть статический класс (мой) в котором я в начале игры достаю из сервера время, как мне потом к нему прибавлять время пройденное в игре что...
Мне необходимо убрать дублирование шапки страницы как на скринахНа первом скрине это макет того как отчет должен выглядеть