Идентификация ASP.NET Core 2.1: как удалить бритвенные страницы пользовательского интерфейса по умолчанию?

Расширяя ответ на этот вопрос: Изменить маршрутизацию в ASP.NET Core Идентификационный интерфейс?

Хавьер рекомендует один из следующих вариантов, если вы хотите настроить URL-адреса:

  • Используйте элемент скаффолдинга пользовательского интерфейса по умолчанию и сделайте все необходимые настройки самостоятельно.
  • Используйте правило перенаправления, которое указывает старые маршруты на новые маршруты.
  • Не используйте пользовательский интерфейс по умолчанию вообще.

Из нового проекта MVC ASP.NET Core 2.1 с установленной аутентификацией: индивидуальные учетные записи пользователей, как НЕ использовать пользовательский интерфейс по умолчанию? Кажется, он установлен по умолчанию вместе с Identity Core.

введите описание изображения здесь

После создания проекта, как удалить бритвенные страницы пользовательского интерфейса по умолчанию и по-прежнему использовать Identity Core?

Могу ли я просто удалить область /Identity/ и вместо этого создать свою AccountController?


person Daniel Congrove    schedule 11.07.2018    source источник
comment
Если вы хотите изменить пользовательский интерфейс, вам нужно изменить только представления. Почему вы хотите изменить контроллер?   -  person Panagiotis Kanavos    schedule 11.07.2018
comment
Я предпочитаю использовать свой собственный маршрут вместо /Identity/Account/, что не рекомендуется для использования в пользовательском интерфейсе.   -  person Daniel Congrove    schedule 11.07.2018
comment
Опять почему? Я предпочитаю быть предшественником того, что он сломан, если вы не понимаете, что он делает. Вопрос, на который вы ссылаетесь, касается только пакета Identity UI. Он используется, поэтому вам не нужно создавать / обрабатывать / управлять более чем 50 файлами, используемыми пользовательским интерфейсом с шаблоном. Если вы хотите изменить пользовательский интерфейс, просто не используйте пакет. Вы можете создавать файлы с помощью dotnet aspnet-codegenerator identity -dc WebApplication1.Data.ApplicationDbContext и изменять их.   -  person Panagiotis Kanavos    schedule 11.07.2018
comment
Проверьте ASP.NET Core 2.1. 0-preview1: Представляем Identity UI как библиотеку. В нем объясняется, что делает пакет Identity UI, почему он был создан и как создавать страницы razor, чтобы вы могли их изменять.   -  person Panagiotis Kanavos    schedule 11.07.2018
comment
Еще лучше - Идентификация каркаса в проектах ASP.NET Core объясняет возможности этого инструмента. Это может помочь вам настроить только те детали, которые вам нужны.   -  person Panagiotis Kanavos    schedule 11.07.2018
comment
Это больше, чем просто предпочтительный маршрут. Мне нравится MVC по сравнению с этими новыми страницами Razor.   -  person Daniel Congrove    schedule 11.07.2018
comment
Вы можете использовать параметр --useDefaultUI для создания и настройки всех страниц.   -  person Panagiotis Kanavos    schedule 12.07.2018


Ответы (3)


Используя статью, на которую ссылается Панайотис Канавос, я смог найти решение.

В ASP.NET Core 2.1.0-preview1 была строка .AddDefaultUI(), которую не нужно было включать в Startup.cs.

services.AddIdentity<IdentityUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultUI()
    .AddDefaultTokenProviders();

Однако в окончательной версии Core 2.1 этот же раздел был упрощен:

services.AddDefaultIdentity<IdentityUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

Решение: если вы измените AddDefaultIdentity обратно на AddIdentity, вы можете изменить значения по умолчанию. I.E. не включайте .AddDefaultUI() (а также не формируйте пользовательский интерфейс), и вы можете написать свой собственный.

services.AddIdentity<IdentityUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
    .AddEntityFrameworkStores<ApplicationDbContext>()
    // .AddDefaultUI()
    .AddDefaultTokenProviders();

Тогда, думаю, безопасно удалить папку /Areas/Identity/, но я не на 100%

Обновление:

Я очистил свой ответ, чтобы подробно описать окончательное решение, к которому я пришел, чтобы удалить страницы бритвы пользовательского интерфейса идентификации по умолчанию, которые поставляются с ASP.NET Core 2.1, и вместо этого использовать MVC.

1) In Startup.cs,

    public void ConfigureServices(IServiceCollection services)
    {
        // Unrelated stuff commented out...

        // BEGIN: Identity Setup (Overrides default identity)
        services.AddIdentity<ApplicationUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();
        // END: Identity Setup

        services.Configure<IdentityOptions>(options =>
        {
            // Set your identity Settings here (password length, etc.)
        });

        // More unrelated stuff commented out...

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        // Added after AddMvc()
        services.ConfigureApplicationCookie(options =>
        {
            options.LoginPath = $"/account/login";
            options.LogoutPath = $"/account/logout";
            options.AccessDeniedPath = $"/account/access-denied";
        });

        // More unrelated stuff commented out...
    }

И, очевидно, замените как ApplicationUser, так и IdentityRole своими собственными классами, если это необходимо.

2) Удалите папку Area для Identity, которая поставляется по умолчанию с вашим проектом ASP.NET Core 2.1.

3) Создайте новый отдельный проект ASP.NET Core 2.0 (не «2.1») с Individual User Account аутентификацией, выбранной в окне создания проекта.

4) Скопируйте AccountController и ManageController с соответствующими ViewModels и Views из проекта 2.0 в свой проект ASP.NET Core 2.1.

Выполняя вышеизложенное, я пока не столкнулся с какими-либо проблемами.

person Daniel Congrove    schedule 11.07.2018
comment
Возможно, вы захотите также настроить EmailService по умолчанию; services.AddSingleton<IEmailService, EmailService>() - person devqon; 16.10.2018
comment
Мне кажется странным, что шаблоны проектов не дают вам возможности выбрать старый стиль контроллера при создании приложения Angular или любого приложения на основе API, если на то пошло. Клиент отправляет данные независимо, поэтому выгода (которую я вижу) в почти меньше выгоды, заставляющей разработчика либо использовать RazorPages и переопределять без необходимости, либо тратить время на извлечение нового и переустановку старого. Разве шаблоны проектов не должны нам помогать? - person ColinM; 18.11.2020

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

person hivie7510    schedule 31.08.2018

Я поддержал первый ответ, потому что он принес мне 90 процентов, хотел выдать остальное (это было слишком долго, чтобы помещать комментарии). Таким образом, вы захотите сохранить эту папку / Areas / Identity /, потому что она указывает на вашу общую папку, если вы используете заголовок из шаблона по умолчанию, если это не имеет значения, удалите его. Бэкэнд по-прежнему будет указывать на Identity/Account/Register/, поэтому создайте контроллер с именем Account, создайте папку в представлениях с именем Account и поместите Register.cshtml. Я взял исходный HTML-код из окна отладчика, который вы можете использовать в качестве шаблона для настройки. Поместите внутрь Register.cshtml:

<div class="container body-content">


<h2>Register</h2>

<div class="row">
    <div class="col-md-4">
        <form method="post" action="/Identity/Account/Register" novalidate="novalidate">
            <h4>Create a new account.</h4>
            <hr>
            <div class="text-danger validation-summary-valid" data-valmsg-summary="true"><ul><li style="display:none"></li>
</ul></div>
            <div class="form-group">
                <label for="Input_Email">Email</label>
                <input class="form-control" type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Input_Email" name="Input.Email" value="">
                <span class="text-danger field-validation-valid" data-valmsg-for="Input.Email" data-valmsg-replace="true"></span>
            </div>
            <div class="form-group">
                <label for="Input_Password">Password</label>
                <input class="form-control" type="password" data-val="true" data-val-length="The Password must be at least 6 and at max 100 characters long." data-val-length-max="100" data-val-length-min="6" data-val-required="The Password field is required." id="Input_Password" name="Input.Password">
                <span class="text-danger field-validation-valid" data-valmsg-for="Input.Password" data-valmsg-replace="true"></span>
            </div>
            <div class="form-group">
                <label for="Input_ConfirmPassword">Confirm password</label>
                <input class="form-control" type="password" data-val="true" data-val-equalto="The password and confirmation password do not match." data-val-equalto-other="*.Password" id="Input_ConfirmPassword" name="Input.ConfirmPassword">
                <span class="text-danger field-validation-valid" data-valmsg-for="Input.ConfirmPassword" data-valmsg-replace="true"></span>
            </div>
            <button type="submit" class="btn btn-default">Register</button>
        <input name="__RequestVerificationToken" type="hidden" value="CfDJ8IWbPHM_NTJDv_7HGewWzbbRveP09yQOznYdTWL2aN5X_4_eVbNE1w8D_qz7zegloVtdAhuVOJbJLQo0ja73FB3PgYycyGpn-DfX3fJqv4Cx8ns6Ygh6M7nMxV0eozO7hoDxUfPwrIJb2RcFtyzhPpMevZ4P0M8aVyBP55SP-5C4l23dCtDXXUOAY_YLwt67dw"></form>
    </div>
</div>


        <hr>
        <footer>
            <p>© 2018 - SqlServerApp</p>
        </footer>
    </div> 

Как говорится в другом ответе, измените Startup:

services.AddIdentity<IdentityUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
    .AddEntityFrameworkStores<ApplicationDbContext>()
    // .AddDefaultUI()
    .AddDefaultTokenProviders();

Также нужно проложить маршрут к вашему контроллеру, тот же файл Startup.cs, сохранить другой маршрут, который там находится, вероятно, оставить его первым, когда я думаю об этом, поскольку он проверяет их последовательно:

app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "identity",
                template: "Identity/{controller=Account}/{action=Register}/{id?}");
person Ryan Dines    schedule 11.07.2018