Заставьте электронную почту ASP.NET Identity 2.0 подтвердить работу токена для WCF и MVC

У меня есть сервисный проект (WCF) и проект MVC, который использует ту же базу данных, чтобы обрабатывать сервисную часть для мобильной и интерфейсной части. Я должен настроить подтверждение по электронной почте на обоих.

Я использовал библиотеку OWIN ASP.NET 2.0 для аутентификации, и оба проекта имеют отдельных UserManager.

Для MVC

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
  var dataProtectionProvider = options.DataProtectionProvider;
  if (dataProtectionProvider != null)
  {
    manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>dataProtectionProvider.Create("ASP.NET"));
  }
}

Для WCF

var provider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("ASP.NET");
UserManager.UserTokenProvider =new Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider<ApplicationUser>(
provider.Create("EmailConfirm"));
var code = idManager.UserManager.GenerateEmailConfirmationToken(appuser.Id);

Проблема Маркер подтверждения электронной почты, сгенерированный в MVC, работает нормально.

В WCF, когда я создаю токен подтверждения электронной почты, его необходимо проверить с веб-сайта MVC. Здесь он дает мне "Неверный токен".

Я думаю, что это из-за несоответствия токенов, я пытался сделать их такими же, как могу, но не знаю, какой из них идет между Wcf и MVC.

Кстати. Я тестирую на localhost от Visual studio.

1 ответ

Решение

Я нашел решение. Проблема была в DataProtectionProvider,

На MVC он получал от:

public static ApplicationUserManager    
    Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
    {
      var dataProtectionProvider = **options.DataProtectionProvider**;

На WCF это было из:

var provider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("ASP.NET");

Так что я использовал так же, как WCF в MVC:

var dataProtectionProvider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("ASP.NET");

Кроме того, ключевым моментом является:

  • Название провайдера. Это должно быть одинаково на обоих.
  • При создании URL из WCF нам нужно использовать HttpUtility.UrlEncode закодировать код токена.

Пример:

var code = UserManager.GenerateEmailConfirmationToken(appuser.Id);    
var callbackUrl = string.Format("http://MVCSite/Account/ConfirmEmail?userId={0}&code={1}",    HttpUtility.UrlEncode(appuser.Id), HttpUtility.UrlEncode(code));

Обновить

Для тех, кто пытается разместить несколько проектов, вам нужно, чтобы одна из этих двух вещей была одинаковой, чтобы иметь возможность использовать код подтверждения:

  • Пул приложений
  • Ключ машины

Ошибка подтверждения электронной почты Неверный токен Идентификатор AspNet

http://gunaatita.com/Blog/How-to-Generate-Machine-Key-using-IIS/1058

Другие вопросы по тегам