Изменить маршрутизацию в ASP.NET Core Identity UI? - PullRequest
0 голосов
/ 04 июня 2018

Я использую новый пакет Identity UI , доступный с момента выпуска ASP.NET Core 2.1.Используя недавно созданный проект MVC, вот несколько доступных URL-адресов страниц:

/Home/About
/Home/Contact
/Identity/Account/Login
/Identity/Account/Register

Как настроить маршрутизацию для удаления части /Identity/ из URL-адресов?

Ответы [ 5 ]

0 голосов
/ 03 ноября 2018

Промежуточное программное обеспечение для перезаписи URL может быть решением:

var options = new RewriteOptions()
        .AddRewrite(@"^Account/(.*)", "Identity/Account/$1", skipRemainingRules: true);
        app.UseRewriter(options);
0 голосов
/ 18 октября 2018

Самое простое, что нужно сделать, это перетащить папку Страницы из Области / Удостоверение в основной проект. Помните, что директива @page (в .cshtml) обеспечивает прямой доступ к представлениям для чего-либо в разделе «Страницы».(страница превращается в действие). Вы также можете переименовать папку «Учетная запись» на другое имя, если хотите изменить страницы по умолчанию / «Учетная запись» / «Вход в систему» ​​и т. д.

. Директива @page также может использоваться для указанияпользовательский путь, такой как: @page "/ Login"

, чтобы получить доступ к странице входа напрямую, перейдя к / Login

0 голосов
/ 12 июля 2018

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

Перейти к Startup.cs:

// USE METHOD WITH LESS DEFAULTS
//
// services.AddDefaultIdentity<IdentityUser>()
//    .AddEntityFrameworkStores<ApplicationDbContext>();
services.AddIdentity<IdentityUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();
//
// ADD A ROUTE BELOW THE DEFAULT ROUTE
//
routes.MapRoute(
            name: "identity",
            template: "Identity/{controller=Account}/{action=Register}/{id?}");

Теперь у нас есть все настройки, кроме представления, поэтому нам нужно проложить маршрут к нему так, как мы обычно это делаем в mvc.Сделать аккаунт контролером.Измените индекс () на регистр ().Создайте в представлениях папку с именем Account.Добавьте файл Register.cshtml, вот оригинальный HTML, настройте под свои нужды:

<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> 
0 голосов
/ 29 августа 2018

В вашем файле startup.cs вы можете изменить:

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

с помощью:

    services.AddMvc().AddRazorPagesOptions(o => o.Conventions.AddAreaFolderRouteModelConvention("Identity", "/Account/", model =>
    {
        foreach (var selector in model.Selectors)
        {
            var attributeRouteModel = selector.AttributeRouteModel;
            attributeRouteModel.Order = -1;
            attributeRouteModel.Template = attributeRouteModel.Template.Remove(0, "Identity".Length);
        }
    })
).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

Он будет маршрутизировать:

/ Идентификация / Аккаунт /Вход в / Учетная запись / Вход в систему

/ Идентификация / Учетная запись / Регистрация в / Учетная запись / Регистрация

и т.д ...

Для обработки ReturnUrl вы можете создать новое Действие:

    [Route("Identity/Account/Login")]
    public IActionResult LoginRedirect(string ReturnUrl)
    {
        return Redirect("/Account/Login?ReturnUrl=" + ReturnUrl);
    }
0 голосов
/ 04 июня 2018

Похоже, это пока невозможно.Глядя на исходный код, становится ясно, что имя зоны жестко закодировано в IdentityDefaultUIConfigureOptions<TUser>:

private const string IdentityUIDefaultAreaName = "Identity";

Это используется в нескольких местах, в том числе при настройке RazorСтраницы .Например:

options.Conventions.AuthorizeAreaFolder(IdentityUIDefaultAreaName, "/Account/Manage");

А также при настройке аутентификации Cookies .Например:

options.LoginPath = $"/{IdentityUIDefaultAreaName}/Account/Login";

Стоит отметить, что сама IdentityDefaultUIConfigureOptions<TUser> защищена, поэтому возможность переопределения параметров не существует.

Я открыл Githubвведите , чтобы узнать, можем ли мы получить отзывы от тех, кто участвует в самом проекте.


2018-06-12 Обновление

Хавьер Кальварро Нельсон изкоманда ASP.NET Core Identity предоставила несколько ценных отзывов по поднятой мной проблеме Github , которую можно обобщить следующим образом:

Основная причина появления пользовательского интерфейса Identityзадача состоит в том, чтобы минимизировать влияние на ваше приложение и обеспечить четкое разделение между кодом приложения и кодом Identity.

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

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

Хотя не поддерживается и не рекомендуется , Хавьер также отмечает, что возможно использовать пользовательский IPageApplicationModelConvention для переопределения URL.Однако, если вы пропустили это, не поддерживается и не рекомендуется .


2018-06-27 Обновление

The официальная документация была обновлена, чтобы лучше объяснить изменения URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...