1. 程式人生 > >Asp.Net.Identity認證不依賴Entity Framework實現方式

Asp.Net.Identity認證不依賴Entity Framework實現方式

aps 新建 create exc spn sharp 個數 blank aspnet

Asp.Net.Identity為何物請自行搜索,也可轉向此文章http://www.cnblogs.com/shanyou/p/3918178.html

本來微軟已經幫我們將授權、認證以及數據庫存儲都一一處理好了。但是總有這種情況,如我們現在的項目是已經存在了數據庫,且庫裏已經有用戶、角色等信息表,但是

我們還是貪心想使用微軟的授權、認證類庫。這裏我就來實際實踐下到底可行不可行~

第一步、新建一個Asp.Net MVC框架的web工程

第二部、Nuget上安裝Microsoft.AspNet.Identity、Microsoft.AspNet.Identity.Owin

其中Microsoft.AspNet.Identity.Owin有依賴項,它依賴了這幾個包:

Microsoft.Owin.Security.OAuth MSDN註解:包含與 OAuth 提供程序相關的類型。(詳細信息參考 https://msdn.microsoft.com/zh-cn/library/microsoft.owin.security.oauth(v=vs.111).aspx)

Microsoft.Owin.Security.Cookies MSDN註解:提供與身份 cookie 相關的類型。 (詳細信息參考 https://msdn.microsoft.com/zh-cn/library/microsoft.owin.security.cookies(v=vs.111).aspx)

Microsoft.Owin.Security MSDN註解:包含與身份驗證相關的類型。 (詳細信息參考 https://msdn.microsoft.com/zh-cn/library/microsoft.owin.security(v=vs.111).aspx)

Microsoft.AspNet.Identity.Core MSDN註解:包含與管理 ASP.NET Identity 的用戶和角色相關的類和接口。

(信息信息參考:https://msdn.microsoft.com/library/microsoft.aspnet.identity(v=vs.111).aspx)

從MSDN的註解可以看出來Microsoft.AspNet.Identity.Owin裏其實就是將網站的登錄、註冊業務場景所需的API進行了封裝;

第三部、建模

如我現在的數據庫的用戶表為BASE_USER,表結構如下

CREATE TABLE [dbo].[BASE_USER](
	[ID] [uniqueidentifier] NOT NULL PRIMARY KEY,
	[NAME] [varchar](50) NOT NULL,
	[PWD] [varchar](50) NOT NULL,
) ON [PRIMARY]

  

我們在工程站點的Models文件夾裏新建一個BASE_USER類,讓它繼承Microsoft.AspNet.Identity.IUser<GUID>,這裏我們加一個數據表不存在的NICKNAME昵稱字段,到後面看看會有什麽效果~

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace IdeintityDemo.Models
{
    public class BASE_USER : Microsoft.AspNet.Identity.IUser<Guid>
    {
        /// <summary>
        /// 用戶編號
        /// </summary>
        public Guid Id { get; set; }
        /// <summary>
        /// 用戶名
        /// </summary>
        public string UserName { get; set; }
        /// <summary>
        /// 密碼
        /// </summary>
        public string PWD { get; set; }
        /// <summary>
        /// 昵稱
        /// </summary>
        public string NickName { get; set; }
    }
}

第四部 創建UserStore類,該類通過繼承接口IUserStore來實現用戶存儲在數據庫的api

using Microsoft.AspNet.Identity;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using IdeintityDemo.Models;
using IdeintityDemo.Common;

namespace IdeintityDemo.Identity
{
    
    public class HsUserStore: Microsoft.AspNet.Identity.IUserStore<BASE_USER, Guid>
    {
        /// <summary>
        /// 創建用戶
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public Task CreateAsync(BASE_USER user)
        {
            return Task.Run(() => {
            string sql = @"INSERT INTO [dbo].[BASE_USER]([ID],[NAME],[PWD])
                        VALUES(@UserID,@name,@pwd)";
                SqlParameter[] parameters = {
                     new SqlParameter("@UserID", user.Id),
                     new SqlParameter("@name", user.UserName),
                     new SqlParameter("@pwd", user.PWD)
                };
                int iResult = DbHelperSQL.ExecuteSql(sql, parameters);
            });
        }
        /// <summary>
        /// 刪除用戶
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public Task DeleteAsync(BASE_USER user)
        {
            return Task.Run(()=> {
                string sql = @"DELETE FROM [dbo].[BASE_USER] WHERE [email protected]";
                SqlParameter[] parameters = {
                     new SqlParameter("@UserID", user.Id)};
                int iResult = DbHelperSQL.ExecuteSql(sql, parameters);
            });
        }
        /// <summary>
        /// 根據用戶id獲取用戶
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        public Task<BASE_USER> FindByIdAsync(Guid userId)
        {
            return Task<BASE_USER>.Run(() =>
             {
                 BASE_USER result = new BASE_USER();
                 string sql = @"SELECT * FROM [dbo].[BASE_USER] WHERE [email protected]";
                 SqlParameter[] parameters = {
                     new SqlParameter("@UserID", userId)};
                 List<BASE_USER> list = new List<BASE_USER>();
                 using (IDataReader data = DbHelperSQL.ExecuteReader(sql, parameters))
                 {
                     while (data.Read())
                     {
                         //model
                         BASE_USER user = new BASE_USER();
                         user.Id = Guid.Parse(data["ID"].ToString());
                         user.UserName = data["NAME"].ToString();
                         user.PWD = data["PWD"].ToString();
                         list.Add(user);
                     }
                 }
                 return list.FirstOrDefault();
             });
        }
        /// <summary>
        /// 根據名稱獲取用戶信息
        /// </summary>
        /// <param name="userName"></param>
        /// <returns></returns>
        public Task<BASE_USER> FindByNameAsync(string userName)
        {
            return Task<BASE_USER>.Run(() =>
            {
                BASE_USER result = new BASE_USER();
                string sql = @"SELECT * FROM [dbo].[BASE_USER] WHERE [email protected]";
                SqlParameter[] parameters = {
                     new SqlParameter("@NAME", userName)};
                List<BASE_USER> list = new List<BASE_USER>();
                using (IDataReader data = DbHelperSQL.ExecuteReader(sql, parameters))
                {
                    while (data.Read())
                    {
                        //model
                        BASE_USER user = new BASE_USER();
                        user.Id = Guid.Parse(data["ID"].ToString());
                        user.UserName = data["NAME"].ToString();
                        user.PWD = data["PWD"].ToString();
                        list.Add(user);
                    }
                }
                return list.FirstOrDefault();
            });
        }
        /// <summary>
        /// 更新用戶
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public Task UpdateAsync(BASE_USER user)
        {
            return Task.Run(() =>
            {
                //省略...
            });
        }
        /// <summary>
        /// 釋放
        /// </summary>
        public void Dispose()
        {
            throw new NotImplementedException();
        }

    }
}

Asp.Net.Identity認證不依賴Entity Framework實現方式