首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET核心和BLAZOR :重置密码

ASP.NET核心和BLAZOR :重置密码
EN

Stack Overflow用户
提问于 2020-06-01 17:33:40
回答 2查看 4.5K关注 0票数 0

喂,

我对blazor和.net很陌生,我想知道如何实现密码重置的最佳方式。目前,我正在使用这个示例来登录etc:Blazor身份验证示例。此示例排除了一个示例,用于重新设置我自己正在寻找的password.So解决方案。

这就是拥有的,它是Razor组件

代码语言:javascript
复制
@page "/ResetPassword"

@inject UserManager<IdentityUser> userManager
@inject NavigationManager navigationManager
@inject IDataProtectionProvider dataProtectionProvider

@if (IsResetSend)
{
    <h3>Reset Password</h3>
    <div>
        A mail has been send with a password reset link, please click this link to set a new password.
    </div>
    <br />
    <a href="/">Back</a>
}
else
{
    <h3>Reset Password</h3>
    <EditForm Model="resetPassword" OnValidSubmit="@SendResetPassword">
        <div class="field">
            <label class="label">E-mail</label>
            <div class="control">
                <InputText id="email" class="input" type="email" @bind-Value="@resetPassword.Email"></InputText>
            </div>
        </div>
        <div class="field">
            <div class="control">
                <button type="submit" class="button is-primary">Sign in</button>
            </div>
        </div>
    </EditForm>
}

@code {

    ResetPassword resetPassword = new ResetPassword();

    bool IsResetSend = false;

    public async void SendResetPassword()
    {
        List<string> mailTo = new List<string>();

        string passwordResetToken;

        var user = await userManager.FindByEmailAsync(resetPassword.Email);

        if (user != null)
        {
            mailTo.Add(resetPassword.Email);

            passwordResetToken = await userManager.GeneratePasswordResetTokenAsync(user);

            //Send mail with the relevant token
            Webco.Email.Entities.EmailObject emailObject = new Webco.Email.Entities.EmailObject();
            emailObject.Email_To = mailTo;
            emailObject.Email_Subject = "Password Reset Webco !";
            emailObject.Email_Message = "Hy There, <br> Please click this link to reset your password : <br> https://localhost:44384/" + passwordResetToken;
            emailObject.SendEmail(emailObject);

            IsResetSend = true;
        }
    }

    public class ResetPassword
    {
        [Required]
        public string Email { get; set; }

    }

正如您所看到的,这是一种向前移动的方法,目前我似乎找不到一种方法来存储密码重置令牌,并在邮件中单击它时捕获它。

在我愿意之前;

  1. 创建随机令牌,将其存储在当前用户的数据库中;UserResetToken
  2. 当用户单击链接时,令牌将提供给网页参数。
  3. 然后,存储过程将找到令牌并清除它,然后在另一个用户表单上更改密码。

我不认为这是最好的实践,它是基于自定义存储过程。有人能指点我吗?

致以敬意,

EN

回答 2

Stack Overflow用户

发布于 2020-06-01 20:31:11

Blazor已经包含了所有必需的示例。创建一个新项目并选择作为应用程序中的身份验证存储。单击项目上的鼠标右键,选择Add->New支架元素,并在右侧选择Identity。Visual将询问您要重写哪些文件,并创建一个完整的示例,您可以使用该示例在您的主应用程序中构建它。

这一页是可能的:

票数 3
EN

Stack Overflow用户

发布于 2020-06-02 20:12:01

经过一番搜索,由于马文的回应,我来到了下面的代码。也许它可以帮助任何人搜索这个话题。需要改进..。

我在开发中的服务器端应用程序中测试了这一点。不是在iis上

了解用户管理器.net核上很棒的youtube系列的链接

Razor组件

代码语言:javascript
复制
@page "/ResetPassword"

@inject UserManager<IdentityUser> userManager
@inject NavigationManager navigationManager
@inject IDataProtectionProvider dataProtectionProvider

@using Microsoft.AspNetCore.WebUtilities;
@using System.Text.Encodings.Web;
@using System.Text;

@* THIS IS THE PART HANDLING THE RESET TOKEN INCOMING VALIDATION *@
@if (IsResetToken)
{

    <h3>Reset Password</h3>
    <div>
        Please enter a new Password bellow;
    </div>
    <br />
    <EditForm Model="@validatePasswordModel" OnValidSubmit="@SetResetPassword">
        <DataAnnotationsValidator />
        <ValidationSummary />

        <div class="field">
            <label class="label">Password</label>
            <div class="control">
                <InputText id="password" class="input" type="password" @bind-Value="@validatePasswordModel.Password"></InputText>
            </div>
        </div>
        <div class="field">
            <label class="label">Confirm password</label>
            <div class="control">
                <InputText id="cpassword" class="input" type="password" @bind-Value="@validatePasswordModel.ConfirmPassword"></InputText>
            </div>
        </div>
        <div class="field">
            <div class="control">
                <button type="submit" class="button is-primary">Set Password</button>
            </div>
        </div>
    </EditForm>
    <br />
    <a href="/">Back</a>

}
else
{

    @* THIS IS THE PART HANDLING THE RESET TOKEN OUTGOING VALIDATION *@

    @if (IsResetSend)
    {
        <h3>Reset Password</h3>
        <div>
            A mail has been send with a password reset link, please click this link to set a new password.
        </div>
        <br />
        <a href="/">Back</a>
    }
    else
    {
        <h3>Reset Password</h3>
        <EditForm Model="requestPasswordModel" OnValidSubmit="@SendResetPassword">
            <div class="field">
                <label class="label">E-mail</label>
                <div class="control">
                    <InputText id="email" class="input" type="email" @bind-Value="@requestPasswordModel.Email"></InputText>
                </div>
            </div>
            <div class="field">
                <div class="control">
                    <button type="submit" class="button is-primary">Sign in</button>
                </div>
            </div>
        </EditForm>
    }
}

@code {

    InputModel requestPasswordModel = new InputModel();
    ResetPasswordModel validatePasswordModel = new ResetPasswordModel();

    string email = "";
    string token = "";

    bool IsResetSend = false;
    bool IsResetToken = false;

    protected override void OnInitialized()
    {

        GetHttpParameters();

    }

    public void GetHttpParameters()
    {
        var uriBuilder = new UriBuilder(navigationManager.Uri);
        var httpQuery = System.Web.HttpUtility.ParseQueryString(uriBuilder.Query);

        email = httpQuery["email"] ?? "";
        token = httpQuery["token"] ?? "";

        if (!string.IsNullOrEmpty(email) && !string.IsNullOrEmpty(token))
        {
            IsResetToken = true;

        }
    }

    public async void SendResetPassword()
    {
        List<string> mailTo = new List<string>();

        string passwordResetToken;
        string passwordResetUrl;

        var user = await userManager.FindByEmailAsync(requestPasswordModel.Email);

        if (user != null)
        {
            passwordResetUrl = navigationManager.BaseUri;

            passwordResetToken = await userManager.GeneratePasswordResetTokenAsync(user);

            passwordResetToken = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(passwordResetToken));

            passwordResetUrl = "https://localhost:44384/ResetPassword?email=" + user.Email + "&token=" + passwordResetToken;

            mailTo.Add(requestPasswordModel.Email);

            //Send mail with the relevant token
            Webco.Email.Entities.EmailObject emailObject = new Webco.Email.Entities.EmailObject();
            emailObject.Email_To = mailTo;
            emailObject.Email_Subject = "Password Reset Webco !";
            emailObject.Email_Message = $"Hy There, <br> Please click this link to reset your password : <br><a href='{HtmlEncoder.Default.Encode(passwordResetUrl)}'> clikcing here </a>.";
            emailObject.SendEmail(emailObject);

            IsResetSend = true;
        }
        else
        {
            //it's a lie
            IsResetSend = true;
        }
    }

    public async void SetResetPassword()
    {
        List<string> mailTo = new List<string>();

        var user = await userManager.FindByEmailAsync(email);

        if (user != null)
        {
            token = System.Text.Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(token));

            var result = await userManager.ResetPasswordAsync(user, token, validatePasswordModel.ConfirmPassword);

            if (result.Succeeded)
            {

                mailTo.Add(email);

                //Send mail with the relevant token
                Webco.Email.Entities.EmailObject emailObject = new Webco.Email.Entities.EmailObject();
                emailObject.Email_To = mailTo;
                emailObject.Email_Subject = "Password Reset Webco !";
                emailObject.Email_Message = $"Hy There, <br> You password was just reset at webco. Not you ? <br> Contact webco for support.";
                emailObject.SendEmail(emailObject);

                navigationManager.NavigateTo("/LoginUserResetPasswordComplete", true);
            }
            else
            {
                navigationManager.NavigateTo("/LoginUserResetPasswordError", true);
            }
        }
        else
        {
            navigationManager.NavigateTo("/LoginUserResetPasswordError",true);
        }

    }

    public class InputModel
    {
        [Required]
        [EmailAddress]
        public string Email { get; set; }
    }

    public class ResetPasswordModel
    {
        [Required]
        public string Password { get; set; }
        [Required]
        [Compare(nameof(Password))]
        public string ConfirmPassword { get; set; }
    }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62137719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档