<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        .net core2.0下使用Identity改用dapper存儲數據(實例講解)

        來源:懂視網 責編:小采 時間:2020-11-27 22:35:12
        文檔

        .net core2.0下使用Identity改用dapper存儲數據(實例講解)

        .net core2.0下使用Identity改用dapper存儲數據(實例講解):前言、 已經好多天沒寫博客了,鑒于空閑無聊之時又興起想寫寫博客,也當是給自己做個筆記。過了這么些天,我的文筆還是依然那么爛就請多多諒解了。今天主要是分享一下在使用.net core2.0下的實際遇到的情況。在使用webapi時用了identity做用戶驗證。官方文
        推薦度:
        導讀.net core2.0下使用Identity改用dapper存儲數據(實例講解):前言、 已經好多天沒寫博客了,鑒于空閑無聊之時又興起想寫寫博客,也當是給自己做個筆記。過了這么些天,我的文筆還是依然那么爛就請多多諒解了。今天主要是分享一下在使用.net core2.0下的實際遇到的情況。在使用webapi時用了identity做用戶驗證。官方文

        前言、

        已經好多天沒寫博客了,鑒于空閑無聊之時又興起想寫寫博客,也當是給自己做個筆記。過了這么些天,我的文筆還是依然那么爛就請多多諒解了。今天主要是分享一下在使用.net core2.0下的實際遇到的情況。在使用webapi時用了identity做用戶驗證。官方文檔是的是用EF存儲數據來使用dapper,因為個人偏好原因所以不想用EF。于是乎就去折騰。改成使用dapper做數據存儲。于是就有了以下的經驗。

        一、使用Identity服務

        先找到Startup.cs 這個類文件 找到 ConfigureServices 方法

        services.AddIdentity<ApplicationUser, ApplicationRole>().AddDefaultTokenProviders();//添加Identity
        services.AddTransient<IUserStore<ApplicationUser>, CustomUserStore>();
        services.AddTransient<IRoleStore<ApplicationRole>, CustomRoleStore>();
        string connectionString = Configuration.GetConnectionString("SqlConnectionStr");
        services.AddTransient<SqlConnection>(e => new SqlConnection(connectionString));
        services.AddTransient<DapperUsersTable>();

        然后在 Configure 方法 的 app.UseMvc() 前加入下列代碼,net core 1.0的時候是app.UseIdentity() 現在已經棄用改為以下方法。

        //使用驗證
        app.UseAuthentication();

        這里的 ApplicationUser 是自定義的一個用戶模型 具體是繼承 IdentityUser 繼承它的一些屬性

        public class ApplicationUser :IdentityUser
         {
         public string AuthenticationType { get; set; }
         public bool IsAuthenticated { get; set; }
         public string Name { get; set; }
         }

        這里的 CustomUserStore 是自定義提供用戶的所有數據操作的方法的類它需要繼承三個接口:IUserStore,IUserPasswordStore,IUserEmailStore

        IUserStore<TUser>接口是在用戶存儲中必須實現的唯一接口。 它定義了用于創建、 更新、 刪除和檢索用戶的方法。

        IUserPasswordStore<TUser>接口定義實現以保持經過哈希處理的密碼的方法。 它包含用于獲取和設置工作經過哈希處理的密碼,以及用于指示用戶是否已設置密碼的方法的方法。

        IUserEmailStore<TUser>接口定義實現以存儲用戶電子郵件地址的方法。 它包含用于獲取和設置的電子郵件地址和是否確認電子郵件的方法。

        這里跟.net core 1.0的實現接口方式有點不同。需要多實現 IUserEmailStore 才能不報錯

        具體代碼如下。以供大家參考。

        CustomUserStore

        using Microsoft.AspNetCore.Identity;
        using System;
        using System.Threading.Tasks;
        using System.Threading;
        
        namespace YepMarsCRM.Web.CustomProvider
        {
         /// <summary>
         /// This store is only partially implemented. It supports user creation and find methods.
         /// </summary>
         public class CustomUserStore : IUserStore<ApplicationUser>,
         IUserPasswordStore<ApplicationUser>,
         IUserEmailStore<ApplicationUser>
         {
         private readonly DapperUsersTable _usersTable;
        
         public CustomUserStore(DapperUsersTable usersTable)
         {
         _usersTable = usersTable;
         }
        
         #region createuser
         public async Task<IdentityResult> CreateAsync(ApplicationUser user,
         CancellationToken cancellationToken = default(CancellationToken))
         {
         cancellationToken.ThrowIfCancellationRequested();
         if (user == null) throw new ArgumentNullException(nameof(user));
        
         return await _usersTable.CreateAsync(user);
         }
         #endregion
        
         public async Task<IdentityResult> DeleteAsync(ApplicationUser user,
         CancellationToken cancellationToken = default(CancellationToken))
         {
         cancellationToken.ThrowIfCancellationRequested();
         if (user == null) throw new ArgumentNullException(nameof(user));
        
         return await _usersTable.DeleteAsync(user);
        
         }
        
         public void Dispose()
         {
         }
        
         public Task<ApplicationUser> FindByEmailAsync(string normalizedEmail, CancellationToken cancellationToken)
         {
         throw new NotImplementedException();
         }
        
         public async Task<ApplicationUser> FindByIdAsync(string userId,
         CancellationToken cancellationToken = default(CancellationToken))
         {
         cancellationToken.ThrowIfCancellationRequested();
         if (userId == null) throw new ArgumentNullException(nameof(userId));
         Guid idGuid;
         if (!Guid.TryParse(userId, out idGuid))
         {
         throw new ArgumentException("Not a valid Guid id", nameof(userId));
         }
        
         return await _usersTable.FindByIdAsync(idGuid);
        
         }
        
         public async Task<ApplicationUser> FindByNameAsync(string userName,
         CancellationToken cancellationToken = default(CancellationToken))
         {
         cancellationToken.ThrowIfCancellationRequested();
         if (userName == null) throw new ArgumentNullException(nameof(userName));
        
         return await _usersTable.FindByNameAsync(userName);
         }
        
         public Task<string> GetEmailAsync(ApplicationUser user, CancellationToken cancellationToken)
         {
         cancellationToken.ThrowIfCancellationRequested();
         if (user == null) throw new ArgumentNullException(nameof(user));
        
         return Task.FromResult(user.Email);
         }
        
         public Task<bool> GetEmailConfirmedAsync(ApplicationUser user, CancellationToken cancellationToken)
         {
         throw new NotImplementedException();
         }
        
         public Task<string> GetNormalizedEmailAsync(ApplicationUser user, CancellationToken cancellationToken)
         {
         throw new NotImplementedException();
         }
        
         public Task<string> GetNormalizedUserNameAsync(ApplicationUser user, CancellationToken cancellationToken)
         {
         throw new NotImplementedException();
         }
        
         public Task<string> GetPasswordHashAsync(ApplicationUser user, CancellationToken cancellationToken)
         {
         cancellationToken.ThrowIfCancellationRequested();
         if (user == null) throw new ArgumentNullException(nameof(user));
        
         return Task.FromResult(user.PasswordHash);
         }
        
         public Task<string> GetUserIdAsync(ApplicationUser user, CancellationToken cancellationToken)
         {
         cancellationToken.ThrowIfCancellationRequested();
         if (user == null) throw new ArgumentNullException(nameof(user));
        
         return Task.FromResult(user.Id.ToString());
         }
        
         public Task<string> GetUserNameAsync(ApplicationUser user, CancellationToken cancellationToken)
         {
         cancellationToken.ThrowIfCancellationRequested();
         if (user == null) throw new ArgumentNullException(nameof(user));
        
         return Task.FromResult(user.UserName);
         }
        
         public Task<bool> HasPasswordAsync(ApplicationUser user, CancellationToken cancellationToken)
         {
         throw new NotImplementedException();
         }
        
         public Task SetEmailAsync(ApplicationUser user, string email, CancellationToken cancellationToken)
         {
         throw new NotImplementedException();
         }
        
         public Task SetEmailConfirmedAsync(ApplicationUser user, bool confirmed, CancellationToken cancellationToken)
         {
         throw new NotImplementedException();
         }
        
         public Task SetNormalizedEmailAsync(ApplicationUser user, string normalizedEmail, CancellationToken cancellationToken)
         {
         cancellationToken.ThrowIfCancellationRequested();
         if (user == null) throw new ArgumentNullException(nameof(user));
         if (normalizedEmail == null) throw new ArgumentNullException(nameof(normalizedEmail));
        
         user.NormalizedEmail = normalizedEmail;
         return Task.FromResult<object>(null);
         }
        
         public Task SetNormalizedUserNameAsync(ApplicationUser user, string normalizedName, CancellationToken cancellationToken)
         {
         cancellationToken.ThrowIfCancellationRequested();
         if (user == null) throw new ArgumentNullException(nameof(user));
         if (normalizedName == null) throw new ArgumentNullException(nameof(normalizedName));
        
         user.NormalizedUserName = normalizedName;
         return Task.FromResult<object>(null);
         }
        
         public Task SetPasswordHashAsync(ApplicationUser user, string passwordHash, CancellationToken cancellationToken)
         {
         cancellationToken.ThrowIfCancellationRequested();
         if (user == null) throw new ArgumentNullException(nameof(user));
         if (passwordHash == null) throw new ArgumentNullException(nameof(passwordHash));
        
         user.PasswordHash = passwordHash;
         return Task.FromResult<object>(null);
        
         }
        
         public Task SetUserNameAsync(ApplicationUser user, string userName, CancellationToken cancellationToken)
         {
         throw new NotImplementedException();
         }
        
         public Task<IdentityResult> UpdateAsync(ApplicationUser user, CancellationToken cancellationToken)
         {
         return _usersTable.UpdateAsync(user);
         }
         }
        }
        
        

        二、使用使用dapper做數據存儲

        接著就是使用dapper做數據存儲。該類的方法都是通過 CustomUserStore 調用去操作數據庫的。具體代碼如下。根據實際的用戶表去操作dapper即可。

        DapperUsersTable

        using Microsoft.AspNetCore.Identity;
        using System.Threading.Tasks;
        using System.Threading;
        using System.Data.SqlClient;
        using System;
        using Dapper;
        using YepMarsCRM.Enterprise.DataBase.Model;
        using YepMarsCRM.Enterprise.DataBase.Data;
        
        namespace YepMarsCRM.Web.CustomProvider
        {
         public class DapperUsersTable
         {
         private readonly SqlConnection _connection;
         private readonly Sys_AccountData _sys_AccountData;
         public DapperUsersTable(SqlConnection connection)
         {
         _connection = connection;
         _sys_AccountData = new Sys_AccountData();
         }
        
         private Sys_Account ApplicationUserToAccount(ApplicationUser user)
         {
         return new Sys_Account
         {
         Id = user.Id,
         UserName = user.UserName,
         PasswordHash = user.PasswordHash,
         Email = user.Email,
         EmailConfirmed = user.EmailConfirmed,
         PhoneNumber = user.PhoneNumber,
         PhoneNumberConfirmed = user.PhoneNumberConfirmed,
         LockoutEnd = user.LockoutEnd?.DateTime,
         LockoutEnabled = user.LockoutEnabled,
         AccessFailedCount = user.AccessFailedCount,
         };
         }
        
         #region createuser
         public async Task<IdentityResult> CreateAsync(ApplicationUser user)
         {
         int rows = await _sys_AccountData.InsertAsync(ApplicationUserToAccount(user));
         if (rows > 0)
         {
         return IdentityResult.Success;
         }
         return IdentityResult.Failed(new IdentityError { Description = $"Could not insert user {user.Email}." });
         }
         #endregion
        
         public async Task<IdentityResult> DeleteAsync(ApplicationUser user)
         {
         //string sql = "DELETE FROM Sys_Account WHERE Id = @Id";
         //int rows = await _connection.ExecuteAsync(sql, new { user.Id });
        
         int rows = await _sys_AccountData.DeleteForPKAsync(ApplicationUserToAccount(user));
        
         if (rows > 0)
         {
         return IdentityResult.Success;
         }
         return IdentityResult.Failed(new IdentityError { Description = $"Could not delete user {user.Email}." });
         }
        
        
         public async Task<ApplicationUser> FindByIdAsync(Guid userId)
         {
         string sql = "SELECT * FROM Sys_Account WHERE Id = @Id;";
         return await _connection.QuerySingleOrDefaultAsync<ApplicationUser>(sql, new
         {
         Id = userId
         });
         }
        
        
         public async Task<ApplicationUser> FindByNameAsync(string userName)
         {
         string sql = "SELECT * FROM Sys_Account WHERE UserName = @UserName;";
        
         return await _connection.QuerySingleOrDefaultAsync<ApplicationUser>(sql, new
         {
         UserName = userName
         });
        
         //var user = new ApplicationUser() { UserName = userName, Email = userName, EmailConfirmed = false };
         //user.PasswordHash = new PasswordHasher<ApplicationUser>().HashPassword(user, "test");
         //return await Task.FromResult(user);
         }
        
         public async Task<IdentityResult> UpdateAsync(ApplicationUser applicationUser)
         {
         var user = ApplicationUserToAccount(applicationUser);
         var result = await _sys_AccountData.UpdateForPKAsync(user);
         if (result > 0)
         {
         return IdentityResult.Success;
         }
         return IdentityResult.Failed(new IdentityError { Description = $"Could not update user {user.Email}." });
         }
         }
        }
        
        

        三、使用UserManager、SignInManager驗證操作

        新建一個 AccountController 控制器 并在構造函數中獲取 依賴注入的對象 UserManager 與 SignInManager 如下:

        [Authorize]
          public class AccountController : Controller
         {
         private readonly UserManager<ApplicationUser> _userManager;
         private readonly SignInManager<ApplicationUser> _signInManager;
         private readonly ILogger _logger;
        
        public AccountController(UserManager<ApplicationUser> userManager,
         SignInManager<ApplicationUser> signInManager,
         ILoggerFactory loggerFactory)
         {
         _userManager = userManager;
         _signInManager = signInManager;
         _logger = loggerFactory.CreateLogger<AccountController>();
         }
         }

        SignInManager 是提供用戶登錄登出的API ,UserManager 是提供用戶管理的API。

        接著來實現一下簡單的登錄登出。

        /// <summary>
         /// 登錄
         /// </summary>
         [HttpPost]
         [AllowAnonymous]
         public async Task<IActionResult> Login(ReqLoginModel req)
         {
         var json = new JsonResultModel<object>();
         if (ModelState.IsValid)
         {
         var result = await _signInManager.PasswordSignInAsync(req.UserName, req.Password, isPersistent: true, lockoutOnFailure: false);
         if (result.Succeeded)
         {
         json.code = "200";
         json.message = "登錄成功";
         }
         else
         {
         json.code = "400";
         json.message = "登錄失敗";
         }
         if (result.IsLockedOut)
         {
         json.code = "401";
         json.message = "賬戶密碼已錯誤3次,賬戶被鎖定,請30分鐘后再嘗試";
         }
         }
         else
         {
         var errorMessges = ModelState.GetErrorMessage();
         json.code = "403";
         json.message = string.Join(",", errorMessges);
         }
         return json.ToJsonResult();
         }
        /// <summary>
         /// 登出
         /// </summary>
         /// <returns></returns>
         [HttpPost]
         public async Task<IActionResult> LogOut()
         {await _signInManager.SignOutAsync();
         var json = new JsonResultModel<object>()
         {
         code = "200",
         data = null,
         message = "登出成功",
         remark = string.Empty
         };
         return json.ToJsonResult();
         }

        四、使用Identity配置

        在 ConfigureServices 方法中加入

        services.Configure<IdentityOptions>(options =>
         {
         // 密碼配置
         options.Password.RequireDigit = false;//是否需要數字(0-9).
         options.Password.RequiredLength = 6;//設置密碼長度最小為6
         options.Password.RequireNonAlphanumeric = false;//是否包含非字母或數字字符。
         options.Password.RequireUppercase = false;//是否需要大寫字母(A-Z).
         options.Password.RequireLowercase = false;//是否需要小寫字母(a-z).
         //options.Password.RequiredUniqueChars = 6;
        
         // 鎖定設置
         options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);//賬戶鎖定時長30分鐘
         options.Lockout.MaxFailedAccessAttempts = 3;//10次失敗的嘗試將賬戶鎖定
         //options.Lockout.AllowedForNewUsers = true;
        
         // 用戶設置
         options.User.RequireUniqueEmail = false; //是否Email地址必須唯一
         });
        
         services.ConfigureApplicationCookie(options =>
         {
         // Cookie settings
         options.Cookie.HttpOnly = true;
         //options.Cookie.Expiration = TimeSpan.FromMinutes(30);//30分鐘
         options.Cookie.Expiration = TimeSpan.FromHours(12);//12小時
         options.LoginPath = "/api/Account/NotLogin"; // If the LoginPath is not set here, ASP.NET Core will default to /Account/Login
         //options.LogoutPath = "/api/Account/Logout"; // If the LogoutPath is not set here, ASP.NET Core will default to /Account/Logout
         //options.AccessDeniedPath = "/Account/AccessDenied"; // If the AccessDeniedPath is not set here, ASP.NET Core will default to /Account/AccessDenied
         options.SlidingExpiration = true;
         });

        五、其他

        在實現的過程中遇到一些小狀況。例如Identity不生效。是因為未在app.UseMvc() 之前使用造成的。 如果未登錄會造成跳轉。后來查看了.net core Identity 的源碼后 發現 如果是ajax情況下 不會跳轉而時 返回401的狀態碼頁面。

        然后就是Idenetity的密碼加密 是用 PasswordHasher 這個類去加密的。如果想用自己的加密方式。只能通過繼承接口去更改原本的方式。然后大致說到這么些。也當是給自己做做筆記。做得不好請大家多給點意見。多多諒解。謝謝。

        以上這篇.net core2.0下使用Identity改用dapper存儲數據(實例講解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        .net core2.0下使用Identity改用dapper存儲數據(實例講解)

        .net core2.0下使用Identity改用dapper存儲數據(實例講解):前言、 已經好多天沒寫博客了,鑒于空閑無聊之時又興起想寫寫博客,也當是給自己做個筆記。過了這么些天,我的文筆還是依然那么爛就請多多諒解了。今天主要是分享一下在使用.net core2.0下的實際遇到的情況。在使用webapi時用了identity做用戶驗證。官方文
        推薦度:
        標簽: 使用 net 數據存儲
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 日本亚洲视频在线| 亚洲综合国产精品第一页| 久久精品国产精品亚洲艾| a色毛片免费视频| 国产亚洲美女精品久久久| 韩日电影在线播放免费版| 亚洲精品国产精品乱码不卡√| 一级做a爰片久久毛片免费陪 | 免费的黄网站男人的天堂| 免费国产人做人视频在线观看| 亚洲精品无码国产片| 国产免费爽爽视频免费可以看| 黄网站在线播放视频免费观看| 亚洲日韩国产一区二区三区| 尤物视频在线免费观看| 亚洲熟妇中文字幕五十中出| 久久免费视频观看| 亚洲乱码一二三四区国产| 免费看国产精品3a黄的视频| 综合偷自拍亚洲乱中文字幕| 亚洲精品高清在线| 久久久久久国产精品免费免费男同| 亚洲日本香蕉视频| 热99re久久精品精品免费| 一区二区三区免费视频播放器| 国产亚洲综合色就色| 99爱在线精品免费观看| 精品国产日韩亚洲一区91| 亚洲熟女一区二区三区| 香蕉97超级碰碰碰免费公| 亚洲AV无码AV男人的天堂不卡| 在线a亚洲v天堂网2019无码| 91精品视频在线免费观看| 亚洲国产一区二区三区在线观看 | 亚洲AV无码久久精品蜜桃| 日韩精品无码区免费专区| 免费国产黄网站在线看| 久久久久亚洲精品无码蜜桃| 四只虎免费永久观看| 久久99精品免费视频| 亚洲AV永久无码精品网站在线观看|