ASP.NET Core分布式项目实战(集成ASP.NETCore Identity)--学习笔记

任务24:集成ASP.NETCore Identity

之前在 Index 页面写了一个 strong 标签,需要加个判断再显示,不然为空没有错误的时候也会显示

@if (!ViewContext.ModelState.IsValid)
{<strong>Error""</strong><div asp-validation-summary="All" class="danger"></div>
}

因为 asp-validation-summary 是 asp.net view 视图会自动控制,而 strong 不会,所以要显示标题需要添加一个判断,那么这里我们直接移除掉,当有错误信息的时候直接显示即可,这里作为上一节的补充

<div asp-validation-summary="All" class="danger"></div>

这一节主要把 Identity 加入进来

一开始我们把 startup 中的 Identity 注释掉了,只需要开启即可

添加包 IdentityServer4,IdentityServer4.AspNetIdentity,添加之后就可以把 AddTestUsers 移除掉,它就不会再用测试里面的 user,

Startup.cs

public void ConfigureServices(IServiceCollection services)
{services.AddDbContext<ApplicationDbContext>(options =>{options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));});services.AddIdentity<ApplicationUser, ApplicationUserRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();services.AddIdentityServer().AddDeveloperSigningCredential().AddInMemoryClients(Config.GetClients()).AddInMemoryApiResources(Config.GetApiResource()).AddInMemoryIdentityResources(Config.GetIdentityResources()).AddAspNetIdentity<ApplicationUser>();//services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)//    .AddCookie(options => {//        options.LoginPath = "/Account/Login";//    });//services.Configure<IdentityOptions>(options =>//{//    options.Password.RequireLowercase = true;//    options.Password.RequireNonAlphanumeric = true;//    options.Password.RequireUppercase = true;//    options.Password.RequiredLength = 12;//});services.AddScoped<ConsentService>();services.AddMvc();
}

接下来要到 AccountController 中切换回原先的登录逻辑

AccountController

private UserManager<ApplicationUser> _userManager;
private SignInManager<ApplicationUser> _signInManager;
private IIdentityServerInteractionService _interaction;//private readonly TestUserStore _users;//public AccountController(TestUserStore users)
//{
//    _users = users;
//}public AccountController(UserManager<ApplicationUser> userManager,SignInManager<ApplicationUser> signInManager,IIdentityServerInteractionService interaction)
{_userManager = userManager;_signInManager = signInManager;_interaction = interaction;
}

接下来改造 AccountController 的 Register 方法,首先把 RegisterViewModel 的 UserName 改回为 Email

RegisterViewModel

public string Email { get; set; }
//public string UserName { get; set; }

AccountController

[HttpPost]
public async Task<IActionResult> Register(RegisterViewModel registerViewModel, string returnUrl  = null)
{if (ModelState.IsValid){ViewData["ReturnUrl"] = returnUrl;var identityUser = new ApplicationUser{Email = registerViewModel.Email,UserName = registerViewModel.Email,NormalizedUserName = registerViewModel.Email,};var identityResult = await _userManager.CreateAsync(identityUser, registerViewModel.Password);if (identityResult.Succeeded){await _signInManager.SignInAsync(identityUser, new AuthenticationProperties { IsPersistent = true });return RedirectToLoacl(returnUrl);}else{AddErrors(identityResult);}}return View();
}

接着改造 AccountController 的 Login 方法,首先把 LoginViewModel 的 UserName 也改回为 Email,并加上一个 RememberMe 字段

LoginViewModel

public string Email { get; set; }
//public string UserName { get; set; }
public bool RememberMe { get; set; }

调用 UserManager 的查找和登录的逻辑

AccountController

[HttpPost]
public async Task<IActionResult> Login(LoginViewModel loginViewModel,string returnUrl)
{if (ModelState.IsValid){ViewData["ReturnUrl"] = returnUrl;var user = await _userManager.FindByEmailAsync(loginViewModel.Email);if (user == null){ModelState.AddModelError(nameof(loginViewModel.Email), "Email not exists");}else{if (await _userManager.CheckPasswordAsync(user, loginViewModel.Password)){AuthenticationProperties props = null;if (loginViewModel.RememberMe){props = new AuthenticationProperties{IsPersistent = true,ExpiresUtc = DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(30)),};}await _signInManager.SignInAsync(user, props);if (_interaction.IsValidReturnUrl(returnUrl)){return Redirect(returnUrl);}return Redirect("~/");}ModelState.AddModelError(nameof(loginViewModel.Password), "Wrong Password");}}return View(loginViewModel);
}

还原 Logout 方法

Logout

public async Task<IActionResult> Logout()
{await _signInManager.SignOutAsync();//await HttpContext.SignOutAsync();return RedirectToAction("Index", "Home");
}

检查一下 view,将 Login.cshtml 里面的 UserName 修改为 Email,model 改为 LoginViewModel

Login.cshtml

@model LoginViewModel;

恢复 Program 中 EF 的初始化

Program

public static void Main(string[] args)
{BuildWebHost(args).MigrateDbContext<ApplicationDbContext>((context, services) =>{new ApplicationDbContextSeed().SeedAsync(context, services).Wait();}).Run();
}

启动程序之后会根据 appsettings.json 中的配置创建数据库

appsettings.json

"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-IdentitySample-CE9DD12E-9C3B-4072-8E38-6F33420849CB;Trusted_Connection=True;MultipleActiveResultSets=true"
}

编译启动程序,可以看到用户表有一条数据

这条数据来自 ApplicationDbContextSeed

public class ApplicationDbContextSeed
{private UserManager<ApplicationUser> _userManager;public async Task SeedAsync(ApplicationDbContext context, IServiceProvider services){if (!context.Users.Any()){_userManager = services.GetRequiredService<UserManager<ApplicationUser>>();var defaultUser = new ApplicationUser {UserName="Administrator",Email ="jessetalk@163.com",NormalizedUserName ="admin"};var result = await _userManager.CreateAsync(defaultUser, "Password$123");if (!result.Succeeded){throw new Exception("初始默认用户失败");}}}
}

浏览器访问

http://localhost:5000/

使用邮箱登录

退出登录之后启动客户端,浏览器访问 5001 之后会跳转到 5000

http://localhost:5001/

输入邮箱和密码之后会来到 consent 页面

点击同意之后跳转到 MvcClient

点击 About 看到用户名是 Administrator,就是数据库里面的用户

这就是我们把程序里面的 TestUserStore 替换为 Identity

课程链接

http://video.jessetalk.cn/course/explore

相关文章

ASP.NET Core分布式项目实战(Consent 代码重构)--学习笔记

ASP.NET Core分布式项目实战(Consent 确认逻辑实现)--学习笔记

ASP.NET Core分布式项目实战(运行Consent Page)--学习笔记

ASP.NET Core分布式项目实战(Consent Controller Get请求逻辑实现)--学习笔记

ASP.NET Core分布式项目实战(Consent视图制作)--学习笔记

ASP.NET Core分布式项目实战(Identity Server 4回顾,Consent 实现思路介绍)--学习笔记

ASP.NET Core分布式项目实战(oauth2 + oidc 实现 client部分)--学习笔记

ASP.NET Core分布式项目实战(oauth2 + oidc 实现 server部分)--学习笔记

ASP.NET Core分布式项目实战(oauth2与open id connect 对比)--学习笔记

ASP.NET Core分布式项目实战(详解oauth2授权码流程)--学习笔记

ASP.NET Core分布式项目实战(oauth密码模式identity server4实现)--学习笔记

ASP.NET&nbsp;Core分布式项目实战(第三方ClientCredential模式调用)--学习笔记

ASP.NET Core分布式项目实战(客户端集成IdentityServer)--学习笔记

ASP.NET Core分布式项目实战(业务介绍,架构设计,oAuth2,IdentityServer4)--学习笔记

ASP.NET Core分布式项目实战(课程介绍,MVP,瀑布与敏捷)--学习笔记

ASP.NET Core快速入门 -- 学习笔记汇总

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[数据结构]链表中销毁和清空的区别

链表是一个很基本的数据结构&#xff0c;其他的数据结构&#xff08;如&#xff1a;栈、队列、二叉树等&#xff09;都可以用链表来实现。 销毁&#xff1a;是先销毁了链表的头&#xff0c;然后接着一个一个的把后面的销毁了&#xff0c;这样这个链表就不能再使用了&#xff0…

java——泛型

文章目录Java 泛型泛型方法实例有界的类型参数:实例泛型类实例类型通配符1、类型通配符一般是使用?代替具体的类型参数。例如 List<?> 在逻辑上是List,List 等所有List<具体类型实参>的父类。实例2、类型通配符上限通过形如List来定义&#xff0c;如此定义就是通…

Dotnet core基于ML.net的销售数据预测实践

ML.net已经进到了1.5版本。作为Microsoft官方的机器学习模型&#xff0c;你不打算用用&#xff1f;一、前言ML.net可以让我们很容易地在各种应用场景中将机器学习加入到应用程序中。这是这个框架很重要的一点。通过ML.net&#xff0c;我们可以使用手中的可用数据&#xff0c;进…

Java中关于省略作用域报错问题分析

这个是很典型的作用域问题&#xff0c;if后如果省略那么if只作用于其后面的第一行代码 这时候如果这行代码只是个变量声明语句的话&#xff0c;这个变量是没有其他任何逻辑可以访问到的&#xff0c;因为作用域问题(如果有/&#xff0c;那么声明语句中声明的变量只在这个个内可用…

java进阶之注解篇

文章目录注解基本语法定义注解元注解编写注解处理器注解元素默认值限制生成外部文件替代方案注解不支持继承实现处理器注解 注解&#xff08;也被称为元数据&#xff09;为我们在代码中添加信息提供了一种形式化的方式&#xff0c;使我们可以在稍后的某个时刻更容易的使用这些…

C#9就这么来了,.NET开发者该做点什么?

就在上周三10号&#xff0c;.NET5.0发布了第5个预览版&#xff0c;同时支持了C#9-preview&#xff01;是的&#xff0c;你没看错&#xff0c;虽然C# 8.0还未正式发布&#xff0c;但是通往C&#xff03;9的漫长道路却已经开始&#xff0c;这发展速度简直了&#xff01;C#语言的快…

C++,Java编程空指针的一个小细节

//判断是否击中了敌人坦克if (hero.shot!null && hero.shot.isLive ){for (int i 0;i<enemyTanks.size();i){EnemyTank enemyTank enemyTanks.get(i);hitTank(hero.shot,enemyTank);}}上面代码的if条件不能写成这样&#xff1a; if ( hero.shot.isLive &&am…

Magicodes.IE在.NET Core中通过请求头导出多种格式文件

原文作者&#xff1a;HueiFeng前言在2.2里程碑中我们增加了一些新的功能,正如标题所写通过请求头进行导出我们不同格式的文件.下面我们来看一下如何使用.通过这种方式无论是对我们的数据多用途&#xff0c;还是说对我们的数据校验都做到了轻松易配。同时我们也将在本周发布2.3版…

使用DQL查询数据

文章目录DQL语言SELECT语法制定查询字段AS 子句作为别名DISTINCT关键字的使用使用表达式的列where条件语句逻辑操作符模糊查询 &#xff1a; 比较操作符连接查询JION自连接排序和分页子查询DQL语言 DQL( Data Query Language 数据查询语言 ) 查询数据库数据 , 如SELECT语句简…

基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(九)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

关于-32768补码的问题

首先要知道的是计算机中补码的表示是唯一且连续的&#xff01;我想这是计算机为什么不用原码来表示的一个原因&#xff01;另外&#xff0c;以补码形式来运算的话&#xff0c;设计的逻辑电路会简单很多&#xff0c;会少很多逻辑运算器件&#xff0c;所以计算机采用补码的形式来…

TCP(发消息:简易代码实现)

文章目录客户端服务器review&#xff1a;查询IP和端口发送文件客户端 链接服务器Socket发送消息 package com.ayv.try02;import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket;//客户端 public class TcoClientDe…

记实现TDengine时序数据库支持 .Net Windows 32位系统踩坑

TDengine是一个高效的存储、查询、分析时序大数据的平台&#xff0c;专为物联网、车联网、工业互联网、运维监测等优化而设计的数据库&#xff0c; 官方目前没有提供完整的.Net Core 解决方案&#xff0c; 因此闲来无事&#xff0c; 从基于restful api 到现在使用官方编译的动态…

SPDY, WebSocket, WebDAV概念

SPDY&#xff08;读作“SPeeDY”&#xff09;是Google开发的基于TCP的应用层协议&#xff0c;用以最小化网络延迟&#xff0c;提升网络速度&#xff0c;优化用户的网络使用体验。SPDY并不是一种用于替代HTTP的协议&#xff0c;而是对HTTP协议的增强。新协议的功能包括数据流的多…

UDP(发短信:简单模拟)

发短信&#xff1a;不用连接&#xff0c;需要知道对方地址 文章目录UDP发送消息实现互相聊天UDP多线程实现聊天UDP发送消息 UDP传输 我们要用UDP传输数据时&#xff0c;怎么用Socket建立连接呢&#xff1f; DatagramSocket与DatagramPacket 建立发送端&#xff0c;接收端。 建…

SilkierQuartz 1.0.21 发布, 是一个 Quartz.NET 的强大且简单的Web管理工具和承载组件...

SilkierQuartz 是一个新的合并了 Quartzmin 和 QuartzHostedService的组件!Quartz.NET 是一个完整的开源的任务规划系统&#xff0c;从小应用至大型企业级应用都可以适用.Quartzmin Quartzmin 是一个 Quartz.NET 的强大且简单的Web管理工具QuartzHostedService QuartzHostedSer…

超文本运输协议HTTP概念

超文本传输协议&#xff08;HTTP&#xff0c;HyperTextTransfer Protocol)是互联网上应用最为广泛的一种网络传输协议&#xff0c;所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 1960年美国人Ted Nelson构思了一种通过计算机处…

多线程(简单实现)

继承Thread类 两条线程交替进行创建线程方式一&#xff1a;继承Theard类&#xff0c;重写run方法&#xff0c;调用start开启线程总结:注意&#xff0c;线程开启不一定立即执行&#xff0c;由CPU调度执行 //两条线程交替进行//创建线程方式一&#xff1a;继承Theard类&#xf…

用C#在STM32上写第一个Hello world

随着微软放弃.Net MF ,通过C#编写STM32 平台上的程序变得渺茫&#xff0c; 但是&#xff0c; 别着急&#xff0c; 目前至少有两个社区在做这件事情&#xff0c; 传承了微软的.Net MF , 一家是 nanoframework,另外一家比较封闭的是 GHI Electronics 地址是: https://github.com/…

如何找到Eclipse左侧项目栏

如何找到Eclipse左侧项目栏 window --> Show View --> other --> Java–> package Explorer