سلام به همه
تا حالا شده وقتی دارین از سیستم identityبرای احراز هویت وبسایتتون یا نرم افزارتون استفاده میکنین
ببینین که یه جاهایی دستتون بستست برای مثال وقتی میخواین کاربراتون رو با نقشی که توی سیستم دارن با یه دستو توی یه .جدول نشون بدین تو این مقاله میخوایم بریم این مشکل رو حل کنیم
دیده شده برو بچه هایی که با این مشکل مواجه میشن میرن میگن اقا ما خودمون سیستم احراز هویت شخصیمون رو میسازیم که دستمون باز باشه و این حرفا ولی واقعا نیازی به اختراع دوباره چرخ نیست و شما هرچی هم حرفه ای بنویسین سیستم رو قطعا نمیشه با سیستمی که تحت نظر مایکروسافت توسعه داده میشه رقابت کنه
خب بریم که داشته باشیم گام های خودمون رو برای شخصی سازی
1. تعریف کلاسهای Identity سفارشی
public class ApplicationUser : IdentityUser
{
public ICollection UserRoles { get; set; }
}
public class ApplicationRole : IdentityRole
{
public ICollection UserRoles { get; set; }
}
سپس، کلاس UserRoles
را تعریف کنید که از IdentityUserRole
ارثبری میکند.
public class UserRoles : IdentityUserRole
{
public virtual ApplicationUser User { get; set; }
public virtual ApplicationRole Role { get; set; }
}
2. پیکربندی DbContext
در کلاس ApplicationDbContext
، روابط بین کاربران و نقشها را پیکربندی کنید.
public class ApplicationDbContext : IdentityDbContext, UserRoles, IdentityUserLogin, IdentityRoleClaim, IdentityUserToken>
{
public ApplicationDbContext(DbContextOptions options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity(userRole =>
{
userRole.HasKey(ur => new { ur.UserId, ur.RoleId });
userRole.HasOne(ur => ur.Role)
.WithMany(r => r.UserRoles)
.HasForeignKey(ur => ur.RoleId)
.IsRequired();
userRole.HasOne(ur => ur.User)
.WithMany(u => u.UserRoles)
.HasForeignKey(ur => ur.UserId)
.IsRequired();
});
}
}
به نوع تعریف dbcontext اینحا خیلی دقت کنید که چطوری داره از identity ارث بری میکنه
3. اجرای مایگریشن
پس از بهروزرسانی مدلها و DbContext، دستورات زیر را برای بهروزرسانی ساختار دیتابیس اجرا کنید:
Add-Migration AddCustomUserRoles
Update-Database
4. کوئری برای دریافت کاربران با نقشها
اکنون میتوانید با استفاده از Include
و ThenInclude
، کاربران با نقشهای آنها را کوئری کنید.
public async Task> GetAllUsersWithRolesAsync()
{
var usersWithRoles = await _context.Users
.Include(u => u.UserRoles)
.ThenInclude(ur => ur.Role)
.Select(u => new UserWithRolesDto
{
UserId = u.Id,
UserName = u.UserName,
Roles = u.UserRoles.Select(ur => ur.Role.Name).ToList()
})
.ToListAsync();
return usersWithRoles;
}
به همین راحتی حالا میتونید جدول شخصی سازی شده role داشته باشید و مواردی که خودتون دلتون میخواد هم بهش اضافه کنید
مقاله برنامه نویسی پیمان دهقان ۱۴۵
تفاوت hashset و list
در این مقاله به بررسی hashset و مقایسه آن با لیست ها میپردازیم
۱۴۰۳/۰۴/۰۱
۱۲۴
پیمان دهقان
شخصی سازی identity
در این مقاله قصد دارم یکم identity مایکروسافت رو شخصی سازی کنم
۱۴۰۳/۰۳/۲۵
۱۴۵
پیمان دهقان