web-dev-qa-db-fra.com

Changer le routage dans l’interface utilisateur d’identité de base ASP.NET?

J'utilise le nouveau package Identity UI package disponible depuis la publication de ASP.NET Core 2.1. En utilisant un projet MVC nouvellement généré, voici quelques URL de page disponibles:

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

Comment configurer le routage pour supprimer la partie /Identity/ des URL?

13
Phil K

On dirait que ce n'est pas encore possible. En regardant le code source, il est clair que le nom de la zone est codé en dur dans IdentityDefaultUIConfigureOptions<TUser> :

private const string IdentityUIDefaultAreaName = "Identity";

Ceci est utilisé dans quelques endroits, y compris lorsque configuration de Razor Pages . par exemple.:

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

Et aussi lorsque configuration de l'authentification des cookies . par exemple.:

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

Il convient de noter que IdentityDefaultUIConfigureOptions<TUser> lui-même est protégé, de sorte que la possibilité de remplacer les options ne semble pas exister.

J'ai ouvert un problème de Github pour voir si nous pouvons obtenir un retour des personnes impliquées dans le projet lui-même.


2018-06-12 Mise à jour

Javier Calvarro Nelson de l'équipe ASP.NET Core Identity a fourni de précieux commentaires dans le problème de Github que j'ai soulevé et qui peut être résumé comme suit:

La principale raison pour laquelle l'interface utilisateur d'identité se trouve dans une zone est de minimiser l'impact sur votre application et de fournir une séparation nette entre le code de votre application et le code d'identité.

Javier recommande l'une des options suivantes lorsque vous souhaitez personnaliser les URL:

  • Utilisez l'élément d'échafaudage de l'interface utilisateur par défaut et effectuez vous-même les personnalisations nécessaires.
  • Utilisez une règle de redirection qui pointe les anciennes routes vers les nouvelles.
  • N'utilisez pas du tout l'interface utilisateur par défaut.

Bien que non pris en charge et non recommandé, Javier souligne également qu'il est possible d'utiliser un IPageApplicationModelConvention personnalisé pour remplacer les URL. Cependant, au cas où vous l'auriez manqué, c'est non supporté et non recommandé.


2018-06-27 Mise à jour

La documentation officielle } _ a maintenant été mise à jour pour mieux expliquer les modifications apportées aux URL.

14
Kirk Larkin

Dans votre startup.cs, vous pouvez changer:

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

avec :

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

Il acheminera:

/Identité/Compte/Connexion à/Compte/Connexion

/Identité/Compte/S'inscrire à/Compte/S'inscrire

etc...

Pour gérer le ReturnUrl vous pouvez créer une nouvelle action:

    [Route("Identity/Account/Login")]
    public IActionResult LoginRedirect(string ReturnUrl)
    {
        return Redirect("/Account/Login?ReturnUrl=" + ReturnUrl);
    }
6
Yanga

La solution la plus simple consiste à faire glisser le dossier Pages du domaine/identité vers le projet principal N'oubliez pas que la directive @page (dans le fichier .cshtml) rend les vues accessibles directement pour tout élément situé sous "Pages" (la page est transformée en une action) Vous pouvez également renommer le dossier du compte en un autre nom si vous souhaitez modifier le nom par défaut /Compte/Login etc pages

la directive @page peut également être utilisée pour spécifier un chemin personnalisé, tel que: @ page "/ Login"

pour accéder directement à la page de connexion en accédant à/Connexion

0
BlackTigerX

En ce qui concerne le routage, Django fait la même chose dans les frameworks Web qui fixent les URL d’authentification. Voici comment personnaliser la vue à votre guise. Ainsi, au lieu de supprimer/Identité/des itinéraires, nous dirons à Identity de ne pas inclure leurs vues et de fournir la route vers la nôtre.

Allez à 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?}");

Nous avons maintenant tout configuré, sauf la vue. Nous devons donc définir un chemin comme d'habitude sous MVC. Faire un contrôleur de compte. Remplacez Index () par Register (). Créez un dossier dans les vues nommées Compte. Ajoutez un fichier Register.cshtml, voici le code HTML original, personnalisez-le selon vos besoins:

<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

Middleware de réécriture d'URL peut être une solution:

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