Używam nowego Identity UI pakiet dostępny od ASP.NET Core 2.1 został wydany. Korzystając z nowo wygenerowanego projektu MVC, oto dostępne adresy URL strony:

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

Jak mogę skonfigurować rouring, aby usunąć część /Identity/ z adresów URL?

20
Phil K 4 czerwiec 2018, 16:45

5 odpowiedzi

Najlepsza odpowiedź

Wygląda na to, że nie jest jeszcze możliwe. Patrząc na kod źródłowy, jest jasne, że nazwa obszaru jest Hardcoded in IdentityDefaultUIConfigureOptions<TUser>:

private const string IdentityUIDefaultAreaName = "Identity";

Jest to używane w garstce miejsc, w tym, gdy Konfigurowanie stron brzytwy. na przykład.:

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

A także kiedy Konfigurowanie uwierzytelniania plików cookie. na przykład.:

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

Warto zauważyć, że sama IdentityDefaultUIConfigureOptions<TUser> jest chroniona, więc możliwość zastąpienia opcji nie wydaje się istnieć.

Otworzyłem Wydanie GitHub, aby sprawdzić, czy możemy uzyskać opinię od osób zaangażowanych w sam projekt.


2018-06-12 Aktualizacja

Javier Calvarro Nelson z zespołu tożsamości rdzenia ASP.NET zapewnił pewne cenne informacje zwrotne w Wydanie GitHub Podniosłem, który można podsumować w następujący sposób:

Głównym powodem Identity interfejsu użytkownika jest w obszarze, jest zminimalizowanie wpływu na aplikację i zapewnienie czystego separacji między kodem aplikacji a kodem tożsamości.

Javier zaleca jedną z następujących opcji, jeśli chcesz dostosować adresy URL:

  • Użyj elementu rusztowania domyślnego interfejsu użytkownika i samodzielnie wprowadzić wszystkie niezbędne dostosowania.
  • Użyj reguły przekierowania, które wskazują stare trasy na nowe trasy.
  • Nie używaj w ogóle domyślnego UI.

Chociaż nieobsługiwane i nie zalecane , Javier wskazuje również, że jest to możliwe , aby użyć niestandardowej IPageApplicationModelConvention, aby zastąpić adresy URL. Jednak w przypadku, gdy go przegapiłeś, jest to nieobsługiwany i nie jest zalecany .


2018-06-27 Aktualizacja

oficjalna dokumentacja został ponownie zaktualizowany, aby lepiej wyjaśnić, wspomniane zmiany adresu URL.

17
Kirk Larkin 27 czerwiec 2018, 09:36

Najprostsza rzecz do zrobienia, jest przeciąganie folderu stron z obszarów / tożsamości do głównego projektu, pamiętaj, że dyrektywa @Page (w .CSHTML) powoduje, że widoki są dostępne bezpośrednio dla wszystkiego pod "stronami" (strona jest przekształcony w akcję) Można również zmienić nazwę folderu konta do innej nazwy, jeśli chcesz zmienić domyślne / konta / logowanie itp.

Dyrektywa @Page może być również używana do określenia niestandardowej ścieżki, takich jak: @Page "/ Login"

Aby mieć dostęp do strony logowania bezpośrednio, nawigując do / logowania

6
BlackTigerX 18 październik 2018, 05:38

W twoim starcie.cs możesz zmienić:

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

Z :

    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);

Będzie trwać:

/ tożsamość / konto / login do / konta / logowanie

/ tożsamość / konto / rejestr do / konto / rejestr

Itp...

Aby obsługiwać Returnurl Możesz utworzyć nową akcję:

    [Route("Identity/Account/Login")]
    public IActionResult LoginRedirect(string ReturnUrl)
    {
        return Redirect("/Account/Login?ReturnUrl=" + ReturnUrl);
    }
5
Yanga 1 wrzesień 2018, 02:35

Jeśli chodzi o routing, jego standard w ramach sieci Web, aby naprawić URL URL URL, Django robi to samo. Oto jak dostosować widok na swoje upodobanie, więc zamiast usuwać / tożsamości / z tras, powiemy tożsamości, aby nie uwzględnić swoich poglądów i podać trasę do naszej.

Idź do 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?}");

Teraz mamy wszystko konfiguracja, ale widok, więc musimy zrobić trasę do tego sposób, w jaki normalnie robisz w MVC. Zrób kontroler konta. Zmień indeks () do rejestracji (). Zrób folder w widokach o nazwie konto. Dodaj plik Register.cshtml, oto oryginalny HTML, dostosuj do swoich potrzeb:

<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
Ryan Dines 12 lipiec 2018, 00:36

URL przepisanie Middleware Maj Bądź rozwiązaniem:

var options = new RewriteOptions()
        .AddRewrite(@"^Account/(.*)", "Identity/Account/$1", skipRemainingRules: true);
        app.UseRewriter(options);
0
Corwin 3 listopad 2018, 19:27