Configurer l'identité de votre projet existant n'est pas une chose difficile. Vous devez installer un package NuGet et effectuer une petite configuration.
Installez d'abord ces packages NuGet avec la console du gestionnaire de package:
PM> Install-Package Microsoft.AspNet.Identity.Owin
PM> Install-Package Microsoft.AspNet.Identity.EntityFramework
PM> Install-Package Microsoft.Owin.Host.SystemWeb
Ajoutez une classe d'utilisateurs et avec IdentityUser
héritage:
public class AppUser : IdentityUser
{
//add your custom properties which have not included in IdentityUser before
public string MyExtraProperty { get; set; }
}
Faites la même chose pour le rôle:
public class AppRole : IdentityRole
{
public AppRole() : base() { }
public AppRole(string name) : base(name) { }
// extra properties here
}
Changez votre DbContext
parent de DbContext
pour IdentityDbContext<AppUser>
aimer ceci:
public class MyDbContext : IdentityDbContext<AppUser>
{
// Other part of codes still same
// You don't need to add AppUser and AppRole
// since automatically added by inheriting form IdentityDbContext<AppUser>
}
Si vous utilisez la même chaîne de connexion et la migration activée, EF créera les tables nécessaires pour vous.
En option, vous pouvez étendre UserManager
pour ajouter la configuration et la personnalisation souhaitées:
public class AppUserManager : UserManager<AppUser>
{
public AppUserManager(IUserStore<AppUser> store)
: base(store)
{
}
// this method is called by Owin therefore this is the best place to configure your User Manager
public static AppUserManager Create(
IdentityFactoryOptions<AppUserManager> options, IOwinContext context)
{
var manager = new AppUserManager(
new UserStore<AppUser>(context.Get<MyDbContext>()));
// optionally configure your manager
// ...
return manager;
}
}
Étant donné que l'identité est basée sur OWIN, vous devez également configurer OWIN:
Ajoutez une classe au App_Start
dossier (ou n'importe où ailleurs si vous le souhaitez). Cette classe est utilisée par OWIN. Ce sera votre classe de démarrage.
namespace MyAppNamespace
{
public class IdentityConfig
{
public void Configuration(IAppBuilder app)
{
app.CreatePerOwinContext(() => new MyDbContext());
app.CreatePerOwinContext<AppUserManager>(AppUserManager.Create);
app.CreatePerOwinContext<RoleManager<AppRole>>((options, context) =>
new RoleManager<AppRole>(
new RoleStore<AppRole>(context.Get<MyDbContext>())));
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Home/Login"),
});
}
}
}
Presque terminé, ajoutez simplement cette ligne de code à votre web.config
fichier pour que OWIN puisse trouver votre classe de démarrage.
<appSettings>
<!-- other setting here -->
<add key="owin:AppStartup" value="MyAppNamespace.IdentityConfig" />
</appSettings>
Désormais, dans l'ensemble du projet, vous pouvez utiliser Identity comme n'importe quel nouveau projet déjà installé par VS. Considérez l'action de connexion par exemple
[HttpPost]
public ActionResult Login(LoginViewModel login)
{
if (ModelState.IsValid)
{
var userManager = HttpContext.GetOwinContext().GetUserManager<AppUserManager>();
var authManager = HttpContext.GetOwinContext().Authentication;
AppUser user = userManager.Find(login.UserName, login.Password);
if (user != null)
{
var ident = userManager.CreateIdentity(user,
DefaultAuthenticationTypes.ApplicationCookie);
//use the instance that has been created.
authManager.SignIn(
new AuthenticationProperties { IsPersistent = false }, ident);
return Redirect(login.ReturnUrl ?? Url.Action("Index", "Home"));
}
}
ModelState.AddModelError("", "Invalid username or password");
return View(login);
}
Vous pouvez créer des rôles et ajouter à vos utilisateurs:
public ActionResult CreateRole(string roleName)
{
var roleManager=HttpContext.GetOwinContext().GetUserManager<RoleManager<AppRole>>();
if (!roleManager.RoleExists(roleName))
roleManager.Create(new AppRole(roleName));
// rest of code
}
Vous pouvez également ajouter un rôle à un utilisateur, comme ceci:
UserManager.AddToRole(UserManager.FindByName("username").Id, "roleName");
En utilisant, Authorize
vous pouvez protéger vos actions ou contrôleurs:
[Authorize]
public ActionResult MySecretAction() {}
ou
[Authorize(Roles = "Admin")]]
public ActionResult MySecretAction() {}
Vous pouvez également installer des packages supplémentaires et les configurer pour répondre à vos besoins, comme Microsoft.Owin.Security.Facebook
vous le souhaitez.
Remarque: n'oubliez pas d'ajouter des espaces de noms pertinents à vos fichiers:
using Microsoft.AspNet.Identity;
using Microsoft.Owin.Security;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin;
using Microsoft.Owin.Security.Cookies;
using Owin;
Vous pouvez également voir mes autres réponses comme celle-ci et ceci pour une utilisation avancée de l'identité.