web-dev-qa-db-fra.com

Identité ASP.NET Core 2.1: Comment supprimer les pages de rasoir de l'interface utilisateur par défaut?

Développer la réponse à cette question: Modifier le routage dans l’interface utilisateur d’identité de base ASP.NET?

Javier recommande l'une des options suivantes lorsque vous souhaitez utiliser 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.

Depuis un nouveau projet MVC ASP.NET Core 2.1, avec le jeu Authentification: comptes d'utilisateurs individuels, comment NE PAS utiliser l'interface utilisateur par défaut? Il semble être installé par défaut avec Identity Core. 

 enter image description here

Une fois le projet créé, quelle est la méthode pour supprimer les pages du rasoir de l'interface utilisateur par défaut tout en utilisant Identity Core? 

Puis-je simplement supprimer la zone /Identity/ et créer ma propre AccountController à la place?

11
Wellspring

En utilisant l'article lié par Panagiotis Kanavos , j'ai pu trouver une solution.

Dans ASP.NET Core 2.1.0-preview1, il y avait une ligne .AddDefaultUI(), que vous n'aviez pas à inclure dans Startup.cs

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

Cependant, dans la version finale de Core 2.1, la même section a été simplifiée:

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

Solution, si vous rétablissez AddDefaultIdentity en AddIdentity, vous pouvez remplacer les valeurs par défaut. C'EST À DIRE. n'incluez pas .AddDefaultUI() (et n'échafaudez pas l'interface utilisateur) et vous pourrez écrire la vôtre.

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

Ensuite, je pense qu'il est prudent de supprimer le dossier /Areas/Identity/, mais je ne suis pas à 100%

Mettre à jour:

J'ai nettoyé ma réponse pour détailler la solution finale que j'ai finalement choisie, pour supprimer les pages de rasoir d'identité par défaut fournies avec ASP.NET Core 2.1 et pour utiliser MVC.

1) Dans 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...
    }

Et évidemment, remplacez ApplicationUser et IdentityRole par vos propres classes si nécessaire.

2) Supprimez le dossier Zone pour Identity fourni par défaut avec votre projet ASP.NET Core 2.1.

3) Créez un nouveau projet ASP.NET Core 2.0 distinct (pas "2.1"), avec l'authentification Individual User Account sélectionnée dans la fenêtre de création du projet. 

4) Copiez les AccountController et ManageController, avec les ViewModels et Views correspondants, du projet 2.0 vers votre projet ASP.NET Core 2.1.

En faisant ce qui précède, je n’ai encore rencontré aucun problème. 

7
Wellspring

J'ai voté en faveur de la première réponse parce que cela m'apportait 90%, je voulais donner le reste (c'était un peu trop long à mettre dans les commentaires). Vous voudrez donc conserver ce dossier/Areas/Identity/car il pointe vers votre dossier partagé si vous utilisez l'en-tête du modèle par défaut. Sinon, supprimez-le. Le système continuera de pointer sur Identity/Account/Register/. Créez donc un contrôleur appelé Account, créez un dossier dans des vues nommées Account et mettez le Register.cshtml. J'ai pris le code HTML d'origine d'une fenêtre de débogage que vous pouvez utiliser comme modèle à personnaliser. Mettez dans 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> 

Comme dit l'autre réponse, modifiez Startup:

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

De plus, vous devez également indiquer la route vers votre contrôleur, le même fichier Startup.cs, conserver l’autre route qui se trouve là-bas, conservez-la d'abord maintenant que j'y pense, car elle les vérifie séquentiellement: 

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

Un peu tard, mais il existe un moyen beaucoup plus facile de le faire. Vous pouvez ajouter un nouvel échafaudage pour tout remplacer. Découvrez cet article entrez la description du lien ici

0
hivie7510