1

我创建了 MVC 4 应用程序。在那个应用程序中

  1. 如果用户忘记密码,我有办法向用户发送电子邮件以重置密码。

  2. 如果管理员想更改用户当前密码,我有方法向用户发送包含相关详细信息的电子邮件。

所以当我尝试发送电子邮件时遇到同样的错误

我收到如下错误

  1. 我为忘记密码方法遇到的错误

在此处输入图像描述

  1. 我为编辑用户方法得到的错误

在此处输入图像描述

好像我在尝试发送电子邮件时遇到了问题,我正在使用 asp.net Identity 会员资格

这是忘记密码方法的相关代码片段

            [HttpPost]
            [AllowAnonymous]
            [ValidateAntiForgeryToken]
            public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model)
            {

            if(ModelState.IsValid)
            {
                var username = await UserManager.FindByNameAsync(model.UserName);
                var user = await UserManager.FindByEmailAsync(model.Email);                   


                if (user != null && username != null)
                {

                        var provider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("My_Application");
                        UserManager.UserTokenProvider = new Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider<ApplicationUser>(provider.Create("EmailConfirmation"));          
                        var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);                   


                        System.Net.Mail.MailMessage m = new System.Net.Mail.MailMessage(
                        ........

这是编辑用户方法的相关代码片段

    [HttpPost]
    [CustomAuthorization(IdentityRoles = "Admin")]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Edit_User(EditUserViewModel editUser)
    {    
        try
        {    
            if (ModelState.IsValid)
            {
                AspNetUser user = db.AspNetUsers.Find(editUser.Id);                                 

                if(editUser.Change == "Yes"){                    

                String userId = editUser.Id;
                String newPassword = editUser.NewPassword;

                var provider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("My_Application");
                UserManager.UserTokenProvider = new Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider<ApplicationUser>(provider.Create("EmailConfirmation"));
                var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);

                System.Net.Mail.MailMessage m = new System.Net.Mail.MailMessage(
................................................

好像在同一个地方有问题,但还没有弄清楚

4

3 回答 3

2

我有同样的问题,然后经过多次研究,我发现问题出在 IIS 部署中

所以按照这个线程我可以解决我的问题

数据保护操作不成功

  1. 打开你的 IIS 管理器
  2. 通过选择您的应用程序,右键单击它,然后选择管理应用程序 -> 高级设置,找出您的应用程序正在使用的 AppPool。
  3. 之后,在左上角,选择 Applications Pools,然后继续选择您的应用使用的 App Pool。
  4. 右键单击它,然后选择 Advanced Settings,转到 Process Model 部分并找到“Load User Profile”选项并将其设置为 true。
于 2015-07-12T16:14:23.290 回答
0

我明白

if (user != null && username != null)

您是否要在构造函数中设置它们?如果是这样,你不能,你需要在方法中设置它们。

于 2015-06-23T11:19:34.817 回答
0

您收到错误代码写入错误的位置。

var provider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("My_Application");
UserManager.UserTokenProvider = new Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider<ApplicationUser>(provider.Create("EmailConfirmation"));

你应该写信给 Startup.Auth 类。撒谎:

app.CreatePerOwinContext(IdentityFactory.CreateContext);
app.CreatePerOwinContext<CustomUserManager>(IdentityFactory.CreateUserManager);

用户管理器定义和设置

 public static CustomUserManager CreateUserManager(IdentityFactoryOptions<CustomUserManager> options, IOwinContext context)
        {
            var manager = new CustomUserManager(new CustomUserStore(context.Get<CustomIdentityDbContext>()));

            manager.UserValidator = new UserValidator<CustomUser, int>(manager)
            {
                AllowOnlyAlphanumericUserNames = false,
                RequireUniqueEmail = true
            };

            manager.UserLockoutEnabledByDefault = true;
            manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(10);
            manager.MaxFailedAccessAttemptsBeforeLockout = 5;

            manager.PasswordValidator = new PasswordValidator
            {
                RequiredLength = 6,
                RequireNonLetterOrDigit = true,
                RequireDigit = true,
                RequireLowercase = true,
                RequireUppercase = true,
            };

            manager.EmailService = new IdentityEmailService();

            var dataProtectionProvider = options.DataProtectionProvider;
            if (dataProtectionProvider != null)
            {
                manager.UserTokenProvider = new DataProtectorTokenProvider<CustomUser, int>(dataProtectionProvider.Create("My_Application"))
                {
                    TokenLifespan = TimeSpan.FromHours(2)
                };
            }

            return manager;
        }

重要提示:你必须在这里小心

 var dataProtectionProvider = options.DataProtectionProvider;
            if (dataProtectionProvider != null)
            {
                manager.UserTokenProvider = new DataProtectorTokenProvider<CustomUser, int>(dataProtectionProvider.Create("FocusOnStoreService"))
                {
                    TokenLifespan = TimeSpan.FromHours(2)
                };
            }
于 2015-07-03T15:21:56.867 回答