您当前的位置: 首页 >  .net

寒冰屋

暂无认证

  • 5浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

要求在ASP.NET Core 2.2中确认电子邮件——第1部分

寒冰屋 发布时间:2019-01-06 15:49:03 ,浏览量:5

目录

介绍

使用代码

先决条件

第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项目。

New Project

创建新的ASP.NET Core Web应用程序并将身份验证更改为单个用户帐户。

New Web App

单击确定。

第2步——初始化数据库

该项目使用SQL Server Express。(您也可要选择自己电脑上安装的数据库)

编辑appsettings.json > ConnectionStrings> DefaultConnection设置数据库。

从VS 2017中的程序包管理器控制台运行命令“Update-Database”。

第3步——搭建Identity

右键单击项目名称>添加>新建构建项。

New Scaffolded Item

在左侧菜单中选择Identity。

Add Scaffolded Identity

单击添加。

选中覆盖所有文件并选择ApplicationDbContext。

Override Identity

单击添加。

第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页面:

Add New Item

然后:

New Razor Page

编辑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

关注
打赏
1665926880
查看更多评论
0.3429s