目录
介绍
使用代码
先决条件
第1步——创建Web应用程序
第2步——初始化数据库
第3步——搭建Identity
第4步——替换默认的EmailSender
第5步——需要确认和唯一的电子邮件
第6步——为UserName添加登录名
第7步——添加未确认的电子邮件页面
第8步——修改登录
第9步——修改确认电子邮件
在新的ASP.NET Core 2.2 Razor页面模板中搭建和修改Identity
- 下载源码 - 921.9 KB
ASP.NET Core 2.2 Web应用程序2部分中的第1部分,用于更新已确认的电子邮件。以下是搭建和修改Identity以在登录前要求确认电子邮件的步骤。
使用代码 先决条件- .NET Core 2.2 SDK
- 以下VS中的一个:
- Visual Studio版本2017年15.9或更高版本
- Visual Studio for Mac 7.7或更高版本
- Visual Studio Code C#扩展版本1.17.1或更高版本
您可以下载VS 2017项目或按照以下步骤修改您自己的项目。
第1步——创建Web应用程序创建一个新的VS 2017项目。
创建新的ASP.NET Core Web应用程序并将身份验证更改为单个用户帐户。
单击确定。
第2步——初始化数据库该项目使用SQL Server Express。(您也可要选择自己电脑上安装的数据库)
编辑appsettings.json > ConnectionStrings> DefaultConnection设置数据库。
从VS 2017中的程序包管理器控制台运行命令“Update-Database”。
第3步——搭建Identity右键单击项目名称>添加>新建构建项。
在左侧菜单中选择Identity。
单击添加。
选中覆盖所有文件并选择ApplicationDbContext。
单击添加。
第4步——替换默认的EmailSender编辑appsettings.json,使用您的电子邮件服务器设置添加EmailSettings:
"EmailSettings": {
"MailServer": "smtp.some_server.com",
"MailPort": 587,
"SenderName": "some name",
"Sender": "some_email@some_server.com",
"Password": "some_password"
}
将名为Entities的新文件夹添加到项目中。
在Entities中添加新命名的类EmailSettings:
public class EmailSettings
{
public string MailServer { get; set; }
public int MailPort { get; set; }
public string SenderName { get; set; }
public string Sender { get; set; }
public string Password { get; set; }
}
将名为Services的新文件夹添加到项目中。
在Services中添加命名的新类EmailSender:
public interface IEmailSender
{
Task SendEmailAsync(string email, string subject, string htmlMessage);
}
public class EmailSender : IEmailSender
{
private readonly EmailSettings _emailSettings;
public EmailSender(IOptions emailSettings)
{
_emailSettings = emailSettings.Value;
}
public Task SendEmailAsync(string email, string subject, string message)
{
try
{
// Credentials
var credentials = new NetworkCredential(_emailSettings.Sender, _emailSettings.Password);
// Mail message
var mail = new MailMessage()
{
From = new MailAddress(_emailSettings.Sender, _emailSettings.SenderName),
Subject = subject,
Body = message,
IsBodyHtml = true
};
mail.To.Add(new MailAddress(email));
// Smtp client
var client = new SmtpClient()
{
Port = _emailSettings.MailPort,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Host = _emailSettings.MailServer,
EnableSsl = true,
Credentials = credentials
};
// Send it...
client.Send(mail);
}
catch (Exception ex)
{
// TODO: handle exception
throw new InvalidOperationException(ex.Message);
}
return Task.CompletedTask;
}
}
将名称空间添加到EmailSender.cs:
using Microsoft.Extensions.Options;
using .Entities;
using System.Net;
using System.Net.Mail;
编辑Startup.cs > ConfigureServices,添加EmailSettings选项:
services.AddOptions();
services.Configure(Configuration.GetSection("EmailSettings"));
添加到Startup.cs >ConfigureServices的底部:
services.AddSingleton();
将名称空间添加到Startup.cs:
using .Entities;
using .Services;
编辑Register.cshtml.cs,ForgotPassword.cshtml.cs和Manage|Index.cshtml.cs使用新EmailSender的namespace:
//using Microsoft.AspNetCore.Identity.UI.Services;
using .Services;
第5步——需要确认和唯一的电子邮件
使用AddIdentity而不是AddDefaultIdentity编辑Startup.cs > ConfigureServices:
//services.AddDefaultIdentity()
services.AddIdentity(config =>
{
config.SignIn.RequireConfirmedEmail = true;
config.User.RequireUniqueEmail = true;
})
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores();
.AddDefaultTokenProviders();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
.AddRazorPagesOptions(options =>
{
options.AllowAreas = true;
options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
});
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = $"/Identity/Account/Login";
options.LogoutPath = $"/Identity/Account/Logout";
options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});
在Areas\Identity\Pages\Account中添加命名为CheckEmail的razer页面:
然后:
编辑CheckEmail.cshtml:
@page
@model CheckEmailModel
@{
ViewData["Title"] = "Check email";
}
@ViewData["Title"]
Please check your inbox to confirm your account.
编辑CheckEmail.cshtml.cs,添加AllowAnonymous装饰:
[AllowAnonymous]
public class CheckEmailModel : PageModel
{
public void OnGet()
{
}
}
将命名空间添加到CheckEmail.cshtml.cs:
using Microsoft.AspNetCore.Authorization;
编辑Register.cshtml.cs > OnPostAsync:
//await _signInManager.SignInAsync(user, isPersistent: false);
//return LocalRedirect(returnUrl);
return RedirectToPage("./CheckEmail");
第6步——为UserName添加登录名
编辑Areas\Identity\Pages\Account\Register.cshtml.cs,将UserName属性添加到Inputmodel:
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} and
at max {1} characters long.", MinimumLength = 6)]
[Display(Name = "Login Name")]
public string UserName { get; set; }
编辑Register.cshtml,添加UserName输入:
InputModel,替换Email为UserName:
public class InputModel
{
[Required]
[Display(Name = "Login Name")]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
编辑Login.cshtml.cs > OnPostAsync,替换Input.Email为Input.UserName:
var result = await _signInManager.PasswordSignInAsync
(Input.UserName, Input.Password, Input.RememberMe, lockoutOnFailure: true);
编辑Login.cshtml,在asp-for上使用UserName更换Email:
OnPostAsync,在result.IsLockedOut之后:
if (result.IsNotAllowed)
{
_logger.LogWarning("User email is not confirmed.");
ModelState.AddModelError(string.Empty, "Email is not confirmed.");
var user = await _userManager.FindByNameAsync(Input.UserName);
UserId = user.Id;
ShowResend = true;
return Page();
}
编辑Login.cshtml,在asp-validation-summary之后:
@{
if (Model.ShowResend)
{
Resend verification?
}
}
第9步——修改确认电子邮件
将ShowInvalid属性添加到Areas\Identity\Pages\Account\ConfirmEmail.cshtml.cs:
public bool ShowInvalid { get; set; }
编辑ConfirmEmail.cshtml.cs > OnGetAsync:
if (!result.Succeeded)
{
//throw new InvalidOperationException($"Error confirming email for user with ID '{userId}':");
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
ShowInvalid = true;
}
编辑ConfirmEmail.cshtml:
@{
if (Model.ShowInvalid)
{
Error confirming your email.
If you can login, try updating your email again.
If you cannot login, try resend verification.
}
else
{
Thank you for confirming your email.
}
}
构建并测试项目。
继续查看第二部分。
原文地址:https://www.codeproject.com/Articles/1272172/Require-Confirmed-Email-in-ASP-NET-Core-2-2-Part-1
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?