asp.net identity 2.0和数据保护操作失败。错误

时间:2014-06-16 22:23:58

标签: c# asp.net-mvc azure asp.net-identity owin

我有一个我刚刚部署到azure的网站。当我尝试在我正在获得的应用程序中注册新用户时

  

数据保护操作失败。

我过去几个小时都在搜索,并找到了一些关于WIF和机器密钥的类似答案。我已尝试按照此帖http://www.cloudidentity.com/blog/2013/01/28/running-wif-based-apps-in-windows-azure-web-sites-4/的建议对我的web.config进行更新。但这似乎没有帮助。

当我开始这个项目时,我开始使用一个空白项目并安装当时的2.0.0 beta2的asp.net identity 2.0 samples软件包。

如果需要代码样本,我将提供,我只是不知道哪个代码与此问题相关,除了我知道当锅炉板注册方法试图生成确认令牌时发生故障。

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
    RecaptchaVerificationHelper recaptchaHelper = this.GetRecaptchaVerificationHelper();


    if (String.IsNullOrEmpty(recaptchaHelper.Response)) // if captcha is empty
    {
        ModelState.AddModelError("", "Captcha answer cannot be empty.");
    }
    else // else captcha is not empty
    {
        RecaptchaVerificationResult recaptchaResult = recaptchaHelper.VerifyRecaptchaResponse(); // verify captcha

        if (recaptchaResult != RecaptchaVerificationResult.Success)
        {
            ModelState.AddModelError("", "Incorrect captcha answer.");
        }
    }

    if (ModelState.IsValid)
    {
        var user = new ApplicationUser
        {
            UserName = model.Email,
            Email = model.Email,
            Company = new Company
            {
                CompanyName = model.CompanyName,
                CreateDate = DateTime.Now,
                SubscriptionStatus = SubscriptionStatus.Free,
                Address1 = model.Address1 ?? string.Empty,
                Address2 = model.Address2 ?? string.Empty,
                City = model.City ?? string.Empty,
                StateId = model.StateId,
                PostalCode = model.PostalCode,
                BusinessType = model.BusinessType,
                OperatingDistance = model.OperatingDistance,
                Phone = PhoneNumber.ToStorage(model.Phone),
                Fax = model.Fax == null ? string.Empty : PhoneNumber.ToStorage(model.Fax),
                PrimaryContactName = model.PrimaryContactName,
                PrimaryContactPhone = PhoneNumber.ToStorage(model.PrimaryContactPhone),
                PrimaryContactTitle = model.PrimaryContactTitle
            }
        };

        var result = await _userManager.CreateAsync(user, model.Password);
        if (result.Succeeded)
        {
            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user.Id);
            var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
            await _userManager.SendEmailAsync(user.Email, "Confirm your account", "Please confirm your account by clicking this link: <a href=\"" + callbackUrl + "\">link</a>");
            ViewBag.Email = model.Email;
            return View("DisplayEmail");
        }
        AddErrors(result);
    }

    // If we got this far, something failed, redisplay form
    rePopRegistrationViewModel(model);
    return View(model);
}

设置数据保护提供程序的位置:IdentityConfig.cs

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
    var manager = new ApplicationUserManager(new bcUserStore(context.Get<ApplicationDbContext>()));
    // Configure validation logic for usernames
    manager.UserValidator = new UserValidator<ApplicationUser>(manager)
    {
        AllowOnlyAlphanumericUserNames = false,
        RequireUniqueEmail = true
    };
    // Configure validation logic for passwords
    manager.PasswordValidator = new PasswordValidator
    {
        RequiredLength = 6,
        RequireNonLetterOrDigit = true,
        RequireDigit = true,
        RequireLowercase = true,
        RequireUppercase = true,
    };
    // Configure user lockout defaults
    manager.UserLockoutEnabledByDefault = true;
    manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
    manager.MaxFailedAccessAttemptsBeforeLockout = 5;
    // Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user
    // You can write your own provider and plug in here.
    manager.RegisterTwoFactorProvider("PhoneCode", new PhoneNumberTokenProvider<ApplicationUser>
    {
        MessageFormat = "Your security code is: {0}"
    });
    manager.RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider<ApplicationUser>
    {
        Subject = "SecurityCode",
        BodyFormat = "Your security code is {0}"
    });
    manager.EmailService = new EmailService();
    manager.SmsService = new SmsService();
    var dataProtectionProvider = options.DataProtectionProvider;
    if (dataProtectionProvider != null)
    {
        manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser, string>(dataProtectionProvider.Create("ASP.Net Identity"));
    }
    return manager;
}

Startup.Auth.cs

public void ConfigureAuth(IAppBuilder app) 
{
    // Configure the db context, user manager and role manager to use a single instance per request
    app.CreatePerOwinContext(ApplicationDbContext.Create);
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
    app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);


    // Enable the application to use a cookie to store information for the signed in user
    // and to use a cookie to temporarily store information about a user logging in with a third party login provider
    // Configure the sign in cookie
    app.UseCookieAuthentication(new CookieAuthenticationOptions {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Account/Login"),
        Provider = new CookieAuthenticationProvider {
            // Enables the application to validate the security stamp when the user logs in.
            // This is a security feature which is used when you change a password or add an external login to your account.  
            OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                validateInterval: TimeSpan.FromMinutes(30),
                regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
        }
    });
    app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

    // Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process.
    app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));

    // Enables the application to remember the second login verification factor such as phone or email.
    // Once you check this option, your second step of verification during the login process will be remembered on the device where you logged in from.
    // This is similar to the RememberMe option when you log in.
    app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);

    // Uncomment the following lines to enable logging in with third party login providers
    //app.UseMicrosoftAccountAuthentication(
    //    clientId: "",
    //    clientSecret: "");

    //app.UseTwitterAuthentication(
    //   consumerKey: "",
    //   consumerSecret: "");

    //app.UseFacebookAuthentication(
    //   appId: "",
    //   appSecret: "");

    //app.UseGoogleAuthentication();
}

0 个答案:

没有答案