使ASP.NET Identity 2.0电子邮件确认令牌适用于WCF和MVC

时间:2015-01-15 13:25:54

标签: c# asp.net-mvc wcf asp.net-identity asp.net-identity-2

我有一个服务项目(WCF)和MVC项目,它使用相同的数据库来处理移动和接口部分的服务部分。我必须在两者上设置电子邮件确认。

我使用OWIN ASP.NET 2.0库进行身份验证,两个项目都有单独的UserManagers。

对于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之间。

顺便说一句。我在Visual Studio上测试localhost。

1 个答案:

答案 0 :(得分:6)

我找到了解决方案。问题是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");

所以我在MVC中使用与WCF相同的东西:

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

此外,关键点是:

  • 提供商名称。它们应该是相同的。
  • 从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));

<强>更新

对于任何尝试托管多个项目的人,您需要使用这两个内容中的一个才能使用确认代码:

  • 应用程序池
  • 机器密钥

Email Confirmation Error Invalid Token AspNet Identity

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