电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

ASP.NET MVC使用Identity增刪改查用戶

瀏覽:46日期:2022-06-09 11:58:25

源碼在這里:https://github.com/darrenji/UseIdentityCRUDUserInMVC,本地下載

在VS2013中創建一個MVC項目,用默認的"無身份驗證"作為身份驗證機制。

通過控制臺下載Bootstrap。

Install-Package -version 3.0.3 bootstrap

下載成功后,在解決方案下的Content和Scripts多了該版本的css和js文件。

把創建項目默認HomeController中的所有Action以及/Views/Home下的所有視圖刪除。

熱熱身

先來做一個簡單練習。

在HomeController中的Index方法中,把一個字典傳遞給視圖。

    public class HomeController : Controller    {public ActionResult Index(){    Dictionary<string, object> data = new Dictionary<string, object>();    data.Add("placeholder", "placeholder");    return View(data);}    }

_Layout.cshtml設置如下:

<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>    <meta charset="utf-8" />    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>ASP.NET Identity實戰</title>    <link href="~/Content/bootstrap.min.css" rel="external nofollow"  rel="stylesheet" />    <link href="~/Content/bootstrap-theme.min.css" rel="external nofollow"  rel="stylesheet" />    <style>.container {padding-top:10px;}.validation-summary-errors{color:red;}    </style></head><body>        <div>@RenderBody()    </div>    @Scripts.Render("~/bundles/jquery")    @Scripts.Render("~/bundles/bootstrap")    @RenderSection("scripts", required: false)</body>

Home/Index.cshtml視圖中:

@{    ViewBag.Title = "Index";    Layout = "~/Views/Shared/_Layout.cshtml";}<div>    <div>用戶明細</div>    <table>@foreach (string key in Model.Keys){    <tr><th>@key</th><td>@Model[key]</td>    </tr>}    </table></div>

前期準備

分別安裝如下組件。

Install-Package Microsoft.AspNet.Identity.EntityFramework –Version 2.0.0
Install-Package Microsoft.AspNet.Identity.OWIN -Version 2.0.0
Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0

配置Web.config如下:

<?xml version="1.0" encoding="utf-8"?><!--  有關如何配置 ASP.NET 應用程序的詳細信息,請訪問  http://go.microsoft.com/fwlink/?LinkId=301880  --><configuration>  <configSections>    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />  </configSections>  <connectionStrings>    <add name="IdentityDb" providerName="System.Data.SqlClient" connectionString="Data Source=(localdb)\v11.0;Initial Catalog=IdentityDb;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False;MultipleActiveResultSets=True"/></connectionStrings>  <appSettings>    <add key="webpages:Version" value="3.0.0.0" />    <add key="webpages:Enabled" value="false" />    <add key="ClientValidationEnabled" value="true" />    <add key="UnobtrusiveJavaScriptEnabled" value="true" />    <add key="owin:AppStartup" value="WebApplication4.IdentityConfig" />  </appSettings>  <system.web>    <compilation debug="true" targetFramework="4.5" />    <httpRuntime targetFramework="4.5" />  </system.web>  <runtime>    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">      <dependentAssembly><assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />      </dependentAssembly>      <dependentAssembly><assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="1.0.0.0-5.0.0.0" newVersion="5.0.0.0" />      </dependentAssembly>      <dependentAssembly><assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />      </dependentAssembly>      <dependentAssembly><assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />      </dependentAssembly>      <dependentAssembly><assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />      </dependentAssembly>    </assemblyBinding>  </runtime>  <entityFramework>    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />    <providers>      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />    </providers>  </entityFramework></configuration>

以上,

  • 增加了connectionStrings節點,將自動創建localdb數據庫
  • 在appSettings節點中增加了一個key為owin:AppStartup項,這是確保OWIN運行正常的全局配置

在Models文件夾下創建如下類。

    public class AppUser : IdentityUser    {    }

在解決方案下創建Infrastructure文件夾。

在Infrastructure文件夾下創建一個上下文類,需要實現IdentityDbContext<>接口。

   public class AppIdentityDbContext : IdentityDbContext<AppUser>    {public AppIdentityDbContext()    : base("IdentityDb"){}static AppIdentityDbContext(){    //使用EF Code First第一次創建的時候調用    Database.SetInitializer<AppIdentityDbContext>(new IdentityDbInit());}public static AppIdentityDbContext Create(){    return new AppIdentityDbContext();}    }    //初始化    public class IdentityDbInit : DropCreateDatabaseIfModelChanges<AppIdentityDbContext>    {protected override void Seed(AppIdentityDbContext context){    PerformInitialSetup(context);    base.Seed(context);}//初始化工作public void PerformInitialSetup(AppIdentityDbContext context){ }    }

在Infrastructure文件夾下創建一個管理用戶的類,需要繼承UserManager<AppUser>類。

還記得,先前在appSettings節點中配置了一個如下方式:

<add key="owin:AppStartup" value="WebApplication4.IdentityConfig" />

OWIN需要一個全局啟動文件,默認會到項目的頂級命名空間下找IdentityConfig這個類。

那就在App_Start中創建IdentityConfig這個類,這個類在WebApplication4這個命名空間下。

namespace WebApplication4{    public class IdentityConfig    {public void Configuration(IAppBuilder app){    app.CreatePerOwinContext<AppIdentityDbContext>(AppIdentityDbContext.Create);    app.CreatePerOwinContext<AppUserManager>(AppUserManager.Create);    app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,LoginPath = new Microsoft.Owin.PathString("/Account/Login")    });}    }}

顯示用戶

創建AdminController,現在可以向視圖傳遞所有的用戶了,編寫如下:

    public class AdminController : Controller    {public ActionResult Index(){    return View(UserManager.Users);}private AppUserManager UserManager{    get    {return HttpContext.GetOwinContext().GetUserManager<AppUserManager>();    }}    }

再創建Admin/Index.cshtml類型為IEnumerable<AppUser>的強類型視圖。

@model IEnumerable<WebApplication4.Models.AppUser>@{    ViewBag.Title = "Index";    Layout = "~/Views/Shared/_Layout.cshtml";}<div>    <div>所有用戶賬戶    </div>    <table><tr><th>ID</th><th>Name</th><th>Email</th><th></th></tr>@if (Model.Count() == 0){    <tr><td colspan="4">還沒有創建用戶</td></tr>}else{    foreach (WebApplication4.Models.AppUser user in Model)    {<tr>    <td>@user.Id</td>    <td>@user.UserName</td>    <td>@user.Email</td>    <td>@using (Html.BeginForm("Delete", "Admin",    new { id = user.Id })){    @Html.ActionLink("編輯", "Edit", new { id = user.Id },    new { @class = "btn btn-primary btn-xs" })    <button    type="submit">刪除    </button>}    </td></tr>    }}    </table></div>@Html.ActionLink("創建用戶", "Create", null, new { @class = "btn btn-primary" })

創建用戶

在Models文件夾下創建一個視圖模型。

namespace WebApplication4.Models{    public class CreateModel    {public string Id { get; set; }[Required]public string Name { get; set; }[Required]public string Email { get; set; }[Required]public string Password { get; set; }    }}

在AdminController中添加創建用戶相關的方法。

   public class AdminController : Controller    {public ActionResult Index(){    return View(UserManager.Users);}//創建顯示public ActionResult Create(){    return View();}[HttpPost]public async Task<ActionResult> Create(CreateModel model){    if(ModelState.IsValid)    {var user = new AppUser{UserName = model.Name, Email = model.Email};IdentityResult result = await UserManager.CreateAsync(user, model.Password);if(result.Succeeded){    return RedirectToAction("Index");}else{    AddErrorsFromResult(result);}    }    return View(model);}//創建接收private void AddErrorsFromResult(IdentityResult result){    foreach(var error in result.Errors)    {ModelState.AddModelError("", error);    }}private AppUserManager UserManager{    get    {return HttpContext.GetOwinContext().GetUserManager<AppUserManager>();    }}    }

在Admin/Create.cshtml視圖頁中:

@model WebApplication4.Models.CreateModel@{    ViewBag.Title = "Create";    Layout = "~/Views/Shared/_Layout.cshtml";}<h2>Create</h2>@using (Html.BeginForm()) {    @Html.AntiForgeryToken()        <div><h4>創建用戶</h4><hr />@Html.ValidationSummary(true)<div>    @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })    <div>@Html.EditorFor(model => model.Name)@Html.ValidationMessageFor(model => model.Name)    </div></div><div>    @Html.LabelFor(model => model.Email, new { @class = "control-label col-md-2" })    <div>@Html.EditorFor(model => model.Email)@Html.ValidationMessageFor(model => model.Email)    </div></div><div>    @Html.LabelFor(model => model.Password, new { @class = "control-label col-md-2" })    <div>@Html.EditorFor(model => model.Password)@Html.ValidationMessageFor(model => model.Password)    </div></div><div>    <div><input type="submit" value="創建用戶" />    </div></div>    </div>}<div>    @Html.ActionLink("返回", "Index")</div>

點擊"創建"按鈕,創建成功返回顯示用戶頁面。

oh, my god,只是配置了一下就有數據了? 數據在哪呢?

點擊左上角的"服務器資源管理器",右鍵"IdentityDb",點擊"刷新"。

再打開AspNetUsers表,剛創建的用戶赫然在列。

好像還有點欠缺,用戶輸入密碼的時候,總應該有些限制吧。

能想到的,ASP.NET Identity都為我們準備好了。有一個PasswordValidator類就是干這個的。

在Infrastructure文件夾中創建一個PasswordValidator類的繼承子類。

namespace WebApplication4.Infrastructure{    public class CustomPasswordValidator : PasswordValidator    {public override async Task<IdentityResult> ValidateAsync(string pass){    IdentityResult result = await base.ValidateAsync(pass);    if (pass.Contains("12345"))    {var errors = result.Errors.ToList();errors.Add("密碼中包含太多連續數字");result = new IdentityResult(errors);    }    return result;}    }}

然后需要把這個規則告訴UserManager。

namespace WebApplication4.Infrastructure{    public class AppUserManager : UserManager<AppUser>    {public AppUserManager(IUserStore<AppUser> store) : base(store) { }public static AppUserManager Create(IdentityFactoryOptions<AppUserManager> options, IOwinContext context){    //identity ef上下文    AppIdentityDbContext db = context.Get<AppIdentityDbContext>();    //與identity ef相關的UserStore    IUserStore<AppUser> us = new UserStore<AppUser>(db);    AppUserManager manager = new AppUserManager(us);    //密碼相關    manager.PasswordValidator = new CustomPasswordValidator { RequiredLength = 6,RequireNonLetterOrDigit = false,RequireDigit = false,RequireLowercase = true,RequireUppercase = true    };    return manager;}    }}

再次運行程序,創建用戶頁面,嘗試輸入不通過的密碼。

不過,關于密碼的規則,似乎可以在View Model的驗證層面就可以解決掉。

編輯和刪除用戶

在AdminController中增加編輯和刪除的部分。

    public class AdminController : Controller    {public ActionResult Index(){    return View(UserManager.Users);}//創建顯示public ActionResult Create(){    return View();}//創建接收[HttpPost]public async Task<ActionResult> Create(CreateModel model){    if(ModelState.IsValid)    {var user = new AppUser{UserName = model.Name, Email = model.Email};IdentityResult result = await UserManager.CreateAsync(user, model.Password);if(result.Succeeded){    return RedirectToAction("Index");}else{    AddErrorsFromResult(result);}    }    return View(model);}//編輯顯示public async Task<ActionResult> Edit(string id){    AppUser user = await UserManager.FindByIdAsync(id);        if(User != null)    {CreateModel createModel = new CreateModel();createModel.Id = user.Id;createModel.Email = user.Email;createModel.Name = user.UserName;createModel.Password = user.PasswordHash;return View(createModel);    }    else    {return RedirectToAction("Index");    }}//接收編輯[HttpPost]public async Task<ActionResult> Edit(CreateModel createModel){        if(ModelState.IsValid)    {AppUser user = await UserManager.FindByIdAsync(createModel.Id);if (user != null){    //關于郵箱    user.Email = createModel.Email;    IdentityResult validEmail = await UserManager.UserValidator.ValidateAsync(user);    if (!validEmail.Succeeded)    {AddErrorsFromResult(validEmail);    }    user.UserName = createModel.Name;    //關于密碼    IdentityResult validPass = null;    if (createModel.Password != string.Empty)    {validPass = await UserManager.PasswordValidator.ValidateAsync(createModel.Password);if (validPass.Succeeded){    user.PasswordHash = UserManager.PasswordHasher.HashPassword(createModel.Password);}else{    AddErrorsFromResult(validPass);}    }    user.Email = createModel.Email;    //驗證結果    if ((validEmail.Succeeded && validPass == null) || (validEmail.Succeeded    && createModel.Password != string.Empty && validPass.Succeeded))    {IdentityResult result = await UserManager.UpdateAsync(user);if (result.Succeeded){    return RedirectToAction("Index");}else{    AddErrorsFromResult(result);}    }    else    {ModelState.AddModelError("", "無此用戶");    }}return View(createModel);    }    else    {return View(createModel);    }    }//刪除[HttpPost]public async Task<ActionResult> Delete(string id){    AppUser user = await UserManager.FindByIdAsync(id);    if(user != null)    {IdentityResult result = await UserManager.DeleteAsync(user);if(result.Succeeded){    return RedirectToAction("Index");}else{    return View("Error", result.Errors);}    }    else    {return View("Error", new string[] { "沒有此用戶" });    }}private void AddErrorsFromResult(IdentityResult result){    foreach(var error in result.Errors)    {ModelState.AddModelError("", error);    }}private AppUserManager UserManager{    get    {return HttpContext.GetOwinContext().GetUserManager<AppUserManager>();    }}    }

Admin/Edit.cshtml視圖。

@model WebApplication4.Models.CreateModel@{    ViewBag.Title = "Edit";    Layout = "~/Views/Shared/_Layout.cshtml";}<h2>Edit</h2>@using (Html.BeginForm()){    @Html.AntiForgeryToken()        <div><hr />@Html.ValidationSummary(true)@Html.HiddenFor(model => model.Id)<div>    @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })    <div>@Html.EditorFor(model => model.Name)@Html.ValidationMessageFor(model => model.Name)    </div></div><div>    @Html.LabelFor(model => model.Email, new { @class = "control-label col-md-2" })    <div>@Html.EditorFor(model => model.Email)@Html.ValidationMessageFor(model => model.Email)    </div></div><div>    @Html.LabelFor(model => model.Password, new { @class = "control-label col-md-2" })    <div>@Html.EditorFor(model => model.Password)@Html.ValidationMessageFor(model => model.Password)    </div></div><div>    <div><input type="submit" value="保存" />    </div></div>    </div>}<div>    @Html.ActionLink("返回", "Index")</div>

另外,如果刪除失敗,跳轉到Shared/Error.cshtml視圖頁。

@model IEnumerable<string>@{ ViewBag.Title = "Error";}<div>    @switch (Model.Count())    {case 0:    @: Something went wrong. Please try again    break;case 1:@Model.First();  break;default:@: 發現如下錯誤:<ul>    @foreach (string error in Model)    {<li>@error</li>    }</ul>    break;    }</div>@Html.ActionLink("確定", "Index", null, new { @class = "btn btn-default" })

至此,使用ASP.NET Identy實現對用戶的增刪改查完畢,ASP.NET Identity真的很好很強大!

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對的支持。如果你想了解更多相關內容請查看下面相關鏈接

標簽: ASP.NET
相關文章:
主站蜘蛛池模板: 杭州营业执照代办-公司变更价格-许可证办理流程_杭州福道财务管理咨询有限公司 | 纸箱网 -纸箱机械|设备|包装纸盒|包装印刷行业门户网站 | 苏州柯瑞德货架-仓库自动化改造解决方案 | 钣金加工厂家-钣金加工-佛山钣金厂-月汇好 | 多功能真空滤油机_润滑油全自动滤油机_高效真空滤油机价格-重庆润华通驰 | 纸箱抗压机,拉力机,脂肪测定仪,定氮仪-山东德瑞克仪器有限公司 | led太阳能路灯厂家价格_风光互补庭院灯_农村市政工程路灯-中山华可路灯品牌 | 浙江工业冷却塔-菱电冷却塔厂家 - 浙江菱电冷却设备有限公司 | 今日热点_实时热点_奇闻异事_趣闻趣事_灵异事件 - 奇闻事件 | 山东活动策划|济南活动公司|济南公关活动策划-济南锐嘉广告有限公司 | 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | WF2户外三防照明配电箱-BXD8050防爆防腐配电箱-浙江沃川防爆电气有限公司 | 上海道勤塑化有限公司| 美能达分光测色仪_爱色丽分光测色仪-苏州方特电子科技有限公司 | 高清视频编码器,4K音视频编解码器,直播编码器,流媒体服务器,深圳海威视讯技术有限公司 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 热工多功能信号校验仪-热电阻热电偶校验仿真仪-金湖虹润仪表 | 盘装氧量分析仪-防爆壁挂氧化锆分析仪-安徽吉帆仪表有限公司 | 生物颗粒燃烧机-生物质燃烧机-热风炉-生物颗粒蒸汽发生器-丽水市久凯能源设备有限公司 | 气动隔膜阀_气动隔膜阀厂家_卫生级隔膜阀价格_浙江浙控阀门有限公司 | 辐射色度计-字符亮度测试-反射式膜厚仪-苏州瑞格谱光电科技有限公司 | 德国进口电锅炉_商用电热水器_壁挂炉_电采暖器_电热锅炉[德国宝] | 技德应用| 合肥展厅设计-安徽展台设计-合肥展览公司-安徽奥美展览工程有限公司 | 江苏远邦专注皮带秤,高精度皮带秤,电子皮带秤研发生产 | 共享雨伞_共享童车_共享轮椅_共享陪护床-共享产品的领先者_有伞科技 | 日本东丽膜_反渗透膜_RO膜价格_超滤膜_纳滤膜-北京东丽阳光官网 日本细胞免疫疗法_肿瘤免疫治疗_NK细胞疗法 - 免疫密码 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 云阳人才网_云阳招聘网_云阳人才市场_云阳人事人才网_云阳人家招聘网_云阳最新招聘信息 | 青岛成人高考_山东成考报名网 | 气动调节阀,电动调节阀,自力式压力调节阀,切断阀「厂家」-浙江利沃夫自控阀门 | 大_小鼠elisa试剂盒-植物_人Elisa试剂盒-PCR荧光定量试剂盒-上海一研生物科技有限公司 | 屏蔽泵厂家,化工屏蔽泵_维修-淄博泵业| Brotu | 关注AI,Web3.0,VR/AR,GPT,元宇宙区块链数字产业 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 陕西鹏展科技有限公司 | 卸料器-卸灰阀-卸料阀-瑞安市天蓝环保设备有限公司 | 光栅尺厂家_数显表维修-苏州泽升精密机械| 重庆磨床过滤机,重庆纸带过滤机,机床伸缩钣金,重庆机床钣金护罩-重庆达鸿兴精密机械制造有限公司 | 工控机-图像采集卡-PoE网卡-人工智能-工业主板-深圳朗锐智科 | 广州物流公司_广州货运公司_广州回程车运输 - 万信物流 |