web-dev-qa-db-fra.com

Comment ajouter une identité ASP.Net à Asp.Net Core lorsque le modèle webApi est sélectionné?

J'ai créé un projet .NET Core avec le modèle WebApi sélectionné ne comprend aucune authentification. Je veux y ajouter une identité ASP.NET pour une autorisation basée sur les rôles. Comment puis-je atteindre cet objectif?

18
Parth Patel

Cela vous donnera une webapi d'ours avec une identité de base aspnet, créez d'abord votre projet (cela suppose que vous avez créé un nouveau dossier et que vous y êtes):

dotnet new webapi

Ajouter une identité principale aspnet:

dotnet add package Microsoft.AspNetCore.Identity

Ajoutez un fournisseur de base de données pour stocker vos données:

dotnet add package Microsoft.EntityFrameworkCore.Sqlite

Ajoutez maintenant un type d'utilisateur, la version la plus simple étant:

public class ApplicationUser : IdentityUser
{
}

Et un contexte db, ici, je configure la chaîne de connexion dans la classe, mais vous voudrez probablement utiliser DbContextOptions à la place:

public class IdentityContext : IdentityDbContext<ApplicationUser>
{
    protected override void OnConfiguring
        (DbContextOptionsBuilder optionsBuilder) => 
            optionsBuilder.UseSqlite("your connection string");
}

Ensuite, dans votre Startup.cs, ajoutez les lignes marquées suivantes:

public Startup(IConfiguration configuration)
{
    Configuration = configuration;

    //add this: simply creates db if it doesn't exist, no migrations
    using (var context = new IdentityContext())
    {
        context.Database.EnsureCreated();
    }
}

public void ConfigureServices(IServiceCollection services)
{
    //add this: register your db context
    services.AddDbContext<IdentityContext>();

    //and this: add identity and create the db
    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<IdentityContext>();

    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //add this
    app.UseAuthentication();

    app.UseMvc();
}

Notez que par défaut, l'extension AddIdentity définira le schéma d'authentification par défaut et ajoutera divers cookies que vous ne voulez probablement pas dans une API, l'alternative réduite est la suivante (pour remplacer l'appel AddIdentity ci-dessus dans ConfigureServices):

services.AddIdentityCore<ApplicationUser>(options => { });
new IdentityBuilder(typeof(ApplicationUser), typeof(IdentityRole), services)
    .AddRoleManager<RoleManager<IdentityRole>>()
    .AddSignInManager<SignInManager<ApplicationUser>>()
    .AddEntityFrameworkStores<IdentityContext>();

Cela vous donnera le côté base de données, vous pouvez ensuite utiliser UserManager et SignInManager pour créer et authentifier des utilisateurs, pour les faire utiliser le système DI:

public class MyController : Controller
{
    private UserManager<ApplicationUser> _userManager = null;
    private SignInManager<ApplicationUser> _signInManager = null;

    public MyController(
        UserManager<ApplicationUser> userManager, 
        SignInManager<ApplicationUser> signInManager)
    {
        _userManager = userManager;
        _signInManager = signInManager;
    }

    //etc...

Et puis utilisez comme suit:

var result = await _userManager.CreateAsync(
    new ApplicationUser()
    {
        UserName = "bob", 
        Email = "[email protected]"
    }, "Test123!");
if (result.Succeeded)
    //do stuff...

Et:

var user = await _userManager.FindByNameAsync("bob");
result = await _signInManager.CheckPasswordSignInAsync(user, "Test123!", false);
if (result.Succeeded)
    //do stuff...

L'utilisation de CheckPasswordSignInAsync au lieu de PasswordSignInAsync évitera la création d'un cookie si AddIdentity est utilisé, si AddIdentityCore était également utilisé ci-dessus, alors vous devez utiliser CheckPasswordSignInAsync as PasswordSignInAsync ne fonctionnera pas car IAuthenticationSignInHandler n'aura pas été configuré.

41
Matt

Le modèle ne fait rien de spécial, tout ce dont vous avez besoin est le package NuGet Microsoft.AspNet.Identity.Core et vous devriez pouvoir suivre à partir d'ici:

https://docs.Microsoft.com/en-us/aspnet/core/security/authentication/identity

0
Kris