Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
Asp.Net Identity به این دلیل طراحی شده است تا به ما توانایی و قابلیت استفاده از Storage Provider های
Net هایی که باIdentity Provider، به ما بدهد . ما میتوانیم از ASP.Net مختلف را در برنامه های
Framework. عرضه شده است استفاده کنیم و هم میتوانیم Providerدر این مقاله .ودمان را طراحی کنیم های خ
. های سفارشی خواهیم پرداخت Provider به بررسی ایجاد
. های سفارشی وجود داردProvider دو دلیل اساسی برای ایجاد
ای که در Identity Provider ای راداریم که توسطdata source در Identity سازی اطالعاتما نیاز به ذخیره
Net Framework. شود ، مثل پایگاه داده هایوجود دارد ، پشتیبانی نمی MySQL یک پایگاه داده ، Oracle یا
. منابع داده های دیگر
ما Provider ، Database schema ای که با Database schema را با استفاده از یک Identity ما باید اطالعات
. متفاوت است ، مدیریت کنیم
Identity Provider ادامه مقاله مشاهده خواهید کرد ، ما قصد پیاده سازی و پیکربندی یک در مثالی که در
. را داریم ASP.Net MVC 5 سفارشی با استفاده از
: ASP.Net MVC ایجاد پروژه
Visual Studio راباز کرده و یک پروژه ASP.NET Web application ایجاد کنید و MVC Template را
. دانتخاب کنی
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
را برای ساختن یک کاربر جدید Registerرا میزنیم تا برنامه اجرا شود . بعد اجرا F5 بعد از ایجاد شدن پروژه
: میزنیم . مراحل زیر را دنبال کنید
: را بزنید Register بعد از پر کردن فیلد های مربوط به ثبت نام
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
: آن را باز کنید root کلیک راست کرده و فولدر App_Data روی فولدر Solution Explorer در
ساخته aspnet-AspNetIdentity-20160402093629 خواهید دید که بعد از اجرای برنامه پایگاه داده ایی با نام
...و username ،Password از این پایگاه داده برای ذخیره سازی اطالعات امنیتی نظیر asp.netخواهد شد ،
. فاده خواهد کرداست
در پایگاه داده ساخته نشده است اما به آن aspnet-AspNetIdentity-2016040209362 توجه داشته باشید که
Customize Identity منتقل میکنیم و آن برای SQL Server ضمیمه شده است . پس ، ما پایگاه داده را به
. کنیماستفاده می
کلیک SQL Server Object Explorer کلیک و سپس روی View و، رویدر قسمت من Visual Studio در
: را باز کنید Table کنید ، پایگاه داده خود را انتخاب کرده و فولدر
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
: ساخته شده است Table پنج
AspNetRoles, AspNetUserClaims, AspNetUserLogins, AspNetUserRoles, AspNetUsers .
: های پایگاه داده خود داشته باشیمmodel ما میتوانیم یک نگاه اجمالی به database diagram با ایجاد یک
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
کنید تنظیم را برای پایگاه داده خود ConnectionString را باز کرده و مشخصات web.Config در نهایت ، فایل
:
: رویمیرا میزنیم تا برنامه اجرا شود ، بعد به سراغ ایجاد یک کاربر جدید م F5 حال
خارجی آماده است . در مرحله بعد ، چگونگی سفارشی کردن Storage درحال حاضر برنامه ما، برای استفاده از یک
. پایگاه داده خارجی را برای شما بیان خواهیم کرد
: Identity Library Project ایجاد
: یممیگذار IdentityLibrary ایجاد کرده و نام آن را class library یک
: را انتخاب کنید Manage NuGet Packages کلیک راست کرده و References روی
Microsoft.AspNet.Identity.Core و Microsoft.AspNet.Identity.EntityFramework را نصب کنید .
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
IdentityUser از کالس این ، کنید ایجاد کاربران اطالعات نگهداری برای IdentityUser یک کالس با نام
: کندبری میارث
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
: را برای نگهداری اطالعات در مورد نقش کاربران را ایجاد کنید IdentityRole کالس
: بصورت پیش فرض از این کالس استفاده خواهد کرد Asp.Net MVCایجاد کنید ، UserStore یک کالس با نام
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
: آن را پیاده سازی میکنیم Storage Provider اما با این وجود ، ما برای سفارشی کردن
: کنیممی RoleStore ، کالسی با نام IRoleIdentity برای پیاده سازی
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
: Entity Framework dataModel ایجاد یک
ADO.NET Entity Data را بزنید ، add new item راست کلیک کرده و IdentityLibrary روی پروژه
Model را انتخاب کرده و Add را بزنید :
Code First From Database را انتخاب کرده و Next را بزنید :
: جدید ایجاد کنیم connection اب کنیم یا اینکه یکتوانیم آن را انتخداریم می data connection اگه ما یک
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
Server Name را انتخاب کنید ، از Windows Authentication یا SQL Server Authentication استفاده
کنید ،
: را بزنید Ok سپس پایگاه داده مورد نظر را انتخاب کرده و
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
: ما را تولید کند model جداول پایگاه داده را چک انتخاب کرده تا
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
: ایجاد شده است ، که به جداول پایگاه داده متصل است IdentityLibrary خب ، پنج کالس در پروژه
: را پیکربندی میکنیم ASP.Net Client ، Custom Identity Library برای هدف قرار دادن
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
: Custom Identity پیاده سازی
: UserStore پیاده سازی •
/// <summary> /// Class that implements the key ASP.NET Identity user store iterfaces /// </summary> public class UserStore<T> : IUserRoleStore<T>, IUserStore<T>, IUserPasswordStore<T>,
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
IUserEmailStore<T>, IUserLockoutStore<T, string>, IUserTwoFactorStore<T, string> where T : IdentityUser { private readonly UserRepository<T> _userTable; private readonly UserRolesRepository _userRolesTable; public UserStore(DatabaseContext databaseContext) { _userTable = new UserRepository<T>(databaseContext); _userRolesTable = new UserRolesRepository(databaseContext); } public Task CreateAsync(T user) { if (user == null) { throw new ArgumentNullException(“user”); } return Task.Run(() => _userTable.Insert(user)); } public Task<T> FindByIdAsync(string userId) { if (string.IsNullOrEmpty(userId)) { throw new ArgumentException(“Null or empty argument: userId”); } return Task.Run(() => _userTable.GeTById(userId)); } public Task<bool> GetTwoFactorEnabledAsync(T user) { return Task.FromResult(user.TwoFactorEnabled); } public Task<T> FindByNameAsync(string userName) { if (string.IsNullOrEmpty(userName)) { throw new ArgumentException(“Null or empty argument: userName”);
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
} return Task.Run(() => _userTable.GeTByName(userName)); } public Task<IList<string>> GetRolesAsync(T user) { if (user == null) { throw new ArgumentNullException(“user”); } return Task.Run(() => _userRolesTable.FindByUserId(user.Id)); } public Task<string> GetPasswordHashAsync(T user) { return Task.Run(() => _userTable.GetPasswordHash(user.Id)); } public Task SetPasswordHashAsync(T user, string passwordHash) { return Task.Run(() => user.PasswordHash = passwordHash); } public Task<T> FindByEmailAsync(string email) { if (String.IsNullOrEmpty(email)) { throw new ArgumentNullException(“email”); } return Task.Run(() => _userTable.GeTByEmail(email)); } public Task<string> GetEmailAsync(T user) { return Task.FromResult(user.Email); } public Task<int> GetAccessFailedCountAsync(T user) { return Task.FromResult(user.AccessFailedCount);
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
} public Task<bool> GetLockoutEnabledAsync(T user) { return Task.FromResult(user.LockoutEnabled); } public Task<DateTimeOffset> GetLockoutEndDateAsync(T user) { return Task.FromResult(user.LockoutEndDateUtc.HasValue ? new DateTimeOffset(DateTime.SpecifyKind(user.LockoutEndDateUtc.Value, DateTimeKind.Utc)) : new DateTimeOffset()); } public Task SetLockoutEnabledAsync(T user, bool enabled) { user.LockoutEnabled = enabled; return Task.Run(() => _userTable.Update(user)); } public Task SetLockoutEndDateAsync(T user, DateTimeOffset lockoutEnd) { throw new NotImplementedException(); } public Task SetTwoFactorEnabledAsync(T user, bool enabled) { throw new NotImplementedException(); } public Task DeleteAsync(T user) { throw new NotImplementedException(); } public Task<int> IncrementAccessFailedCountAsync(T user) { throw new NotImplementedException(); }
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
public Task ResetAccessFailedCountAsync(T user) { throw new NotImplementedException(); } public Task<bool> GetEmailConfirmedAsync(T user) { throw new NotImplementedException(); } public Task SetEmailAsync(T user, string email) { throw new NotImplementedException(); } public Task SetEmailConfirmedAsync(T user, bool confirmed) { throw new NotImplementedException(); } public Task<bool> IsInRoleAsync(T user, string roleName) { throw new NotImplementedException(); } public Task RemoveFromRoleAsync(T user, string roleName) { throw new NotImplementedException(); } public Task<bool> HasPasswordAsync(T user) { throw new NotImplementedException(); } public Task UpdateAsync(T user) { throw new NotImplementedException(); } public Task AddToRoleAsync(T user, string roleName) { throw new NotImplementedException();
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
} public void Dispose() { //throw new NotImplementedException(); } }
: سازی آنو پیاده UserRepository ایجاد یک کالس •
public class UserRepository<T> where T : IdentityUser { private readonly DatabaseContext _databaseContext; public UserRepository(DatabaseContext databaseContext) { _databaseContext = databaseContext; } internal T GeTByName(string userName) { var user = _databaseContext.AspNetUsers.SingleOrDefault(u => u.UserName == userName); if (user != null) { T result = (T)Activator.CreateInstance(typeof(T)); result.Id = user.Id;
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
result.UserName = user.UserName; result.PasswordHash = user.PasswordHash; result.SecurityStamp = user.SecurityStamp; result.Email = result.Email; result.EmailConfirmed = user.EmailConfirmed; result.PhoneNumber = user.PhoneNumber; result.PhoneNumberConfirmed = user.PhoneNumberConfirmed; result.LockoutEnabled = user.LockoutEnabled; result.LockoutEndDateUtc = user.LockoutEndDateUtc; result.AccessFailedCount = user.AccessFailedCount; return result; } return null; } internal T GeTByEmail(string email) { var user = _databaseContext.AspNetUsers.SingleOrDefault(u => u.Email == email); if (user != null) { T result = (T)Activator.CreateInstance(typeof(T)); result.Id = user.Id; result.UserName = user.UserName; result.PasswordHash = user.PasswordHash; result.SecurityStamp = user.SecurityStamp; result.Email = result.Email; result.EmailConfirmed = user.EmailConfirmed; result.PhoneNumber = user.PhoneNumber; result.PhoneNumberConfirmed = user.PhoneNumberConfirmed; result.LockoutEnabled = user.LockoutEnabled; result.LockoutEndDateUtc = user.LockoutEndDateUtc; result.AccessFailedCount = user.AccessFailedCount; return result; } return null; } internal int Insert(T user) { _databaseContext.AspNetUsers.Add(new AspNetUsers { Id = user.Id,
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
UserName = user.UserName, PasswordHash = user.PasswordHash, SecurityStamp = user.SecurityStamp, Email = user.Email, EmailConfirmed = user.EmailConfirmed, PhoneNumber = user.PhoneNumber, PhoneNumberConfirmed = user.PhoneNumberConfirmed, LockoutEnabled = user.LockoutEnabled, LockoutEndDateUtc = user.LockoutEndDateUtc, AccessFailedCount = user.AccessFailedCount }); return _databaseContext.SaveChanges(); } /// <summary> /// Returns an T given the user’s id /// </summary> /// <param name=”userId”>The user’s id</param> /// <returns></returns> public T GeTById(string userId) { var user = _databaseContext.AspNetUsers.Find(userId); T result = (T)Activator.CreateInstance(typeof(T)); result.Id = user.Id; result.UserName = user.UserName; result.PasswordHash = user.PasswordHash; result.SecurityStamp = user.SecurityStamp; result.Email = result.Email; result.EmailConfirmed = user.EmailConfirmed; result.PhoneNumber = user.PhoneNumber; result.PhoneNumberConfirmed = user.PhoneNumberConfirmed; result.LockoutEnabled = user.LockoutEnabled; result.LockoutEndDateUtc = user.LockoutEndDateUtc; result.AccessFailedCount = user.AccessFailedCount; return result; } /// <summary> /// Return the user’s password hash /// </summary> /// <param name=”userId”>The user’s id</param>
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
/// <returns></returns> public string GetPasswordHash(string userId) { var user = _databaseContext.AspNetUsers.FirstOrDefault(u => u.Id == userId); var passHash = user != null ? user.PasswordHash : null; return passHash; } /// <summary> /// Updates a user in the Users table /// </summary> /// <param name=”user”></param> /// <returns></returns> public int Update(T user) { var result = _databaseContext.AspNetUsers.FirstOrDefault(u => u.Id == user.Id); if (result != null) { result.UserName = user.UserName; result.PasswordHash = user.PasswordHash; result.SecurityStamp = user.SecurityStamp; result.Email = result.Email; result.EmailConfirmed = user.EmailConfirmed; result.PhoneNumber = user.PhoneNumber; result.PhoneNumberConfirmed = user.PhoneNumberConfirmed; result.LockoutEnabled = user.LockoutEnabled; result.LockoutEndDateUtc = user.LockoutEndDateUtc; result.AccessFailedCount = user.AccessFailedCount; return _databaseContext.SaveChanges(); } return 0; } }
: و پیاده سازی آن UserRolesRepository ایجاد یک کالس •
با پایگاه داده خارجی Asp.Net Identityآموزش سفارشی کردن عنوان مقاله :
تهیه وتنظیم کننده : مرجع تخصصی برنامه نویسان
www.barnamenevisan.org [email protected]
. آماده است IdentityLibrary حال ، برنامه ما برای استفاده از