Заставьте электронную почту 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