Cấu hình danh tính cho dự án hiện tại của bạn không phải là điều khó. Bạn phải cài đặt một số gói NuGet và thực hiện một số cấu hình nhỏ.
Trước tiên hãy cài đặt các gói NuGet này với Gói quản lý gói:
PM> Install-Package Microsoft.AspNet.Identity.Owin
PM> Install-Package Microsoft.AspNet.Identity.EntityFramework
PM> Install-Package Microsoft.Owin.Host.SystemWeb
Thêm một lớp người dùng và với IdentityUser
sự kế thừa:
public class AppUser : IdentityUser
{
//add your custom properties which have not included in IdentityUser before
public string MyExtraProperty { get; set; }
}
Làm điều tương tự cho vai trò:
public class AppRole : IdentityRole
{
public AppRole() : base() { }
public AppRole(string name) : base(name) { }
// extra properties here
}
Thay đổi của bạn DbContext
mẹ từ DbContext
để IdentityDbContext<AppUser>
như thế này:
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>
}
Nếu bạn sử dụng cùng một chuỗi kết nối và cho phép di chuyển, EF sẽ tạo các bảng cần thiết cho bạn.
Tùy chọn, bạn có thể mở rộng UserManager
để thêm cấu hình và tùy chỉnh mong muốn của mình:
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;
}
}
Vì Danh tính dựa trên OWIN, bạn cũng cần định cấu hình OWIN:
Thêm một lớp vào App_Start
thư mục (hoặc bất cứ nơi nào khác nếu bạn muốn). Lớp này được sử dụng bởi OWIN. Đây sẽ là lớp khởi nghiệp của bạn.
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"),
});
}
}
}
Hầu như hoàn thành chỉ cần thêm dòng mã này vào web.config
tệp của bạn để OWIN có thể tìm thấy lớp khởi động của bạn.
<appSettings>
<!-- other setting here -->
<add key="owin:AppStartup" value="MyAppNamespace.IdentityConfig" />
</appSettings>
Bây giờ trong toàn bộ dự án, bạn có thể sử dụng Danh tính giống như bất kỳ dự án mới nào đã được cài đặt bởi VS. Xem xét hành động đăng nhập chẳng hạn
[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);
}
Bạn có thể tạo vai trò và thêm vào người dùng của mình:
public ActionResult CreateRole(string roleName)
{
var roleManager=HttpContext.GetOwinContext().GetUserManager<RoleManager<AppRole>>();
if (!roleManager.RoleExists(roleName))
roleManager.Create(new AppRole(roleName));
// rest of code
}
Bạn cũng có thể thêm vai trò cho người dùng, như thế này:
UserManager.AddToRole(UserManager.FindByName("username").Id, "roleName");
Bằng cách sử dụng, Authorize
bạn có thể bảo vệ hành động hoặc bộ điều khiển của mình:
[Authorize]
public ActionResult MySecretAction() {}
hoặc là
[Authorize(Roles = "Admin")]]
public ActionResult MySecretAction() {}
Bạn cũng có thể cài đặt các gói bổ sung và định cấu hình chúng để đáp ứng yêu cầu của bạn như thế Microsoft.Owin.Security.Facebook
nào hoặc bất cứ điều gì bạn muốn.
Lưu ý: Đừng quên thêm các không gian tên có liên quan vào tệp của bạn:
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;
Bạn cũng có thể thấy các câu trả lời khác của tôi như thế này và câu trả lời này để sử dụng Nhận dạng nâng cao.