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?
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é.
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