使 ASP.NET 身份 2.0 电子邮件确认令牌适用于 WCF 和 MVC
Make ASP.NET Identity 2.0 Email confirm token work for WCF and MVC
我有一个使用相同数据库的服务项目 (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 网站对其进行验证。
在这里它给了我 "Invalid Token".
我认为这是由于令牌代码不匹配,我尽量使它们相同,但真的不知道 Wcf 和 MVC 之间的哪个位置。
顺便说一句。我正在 Visual studio.
的本地主机上进行测试
我找到了解决办法。问题是 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 创建 URL 时,我们需要使用
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));
更新
对于尝试托管多个项目的任何人,您需要以下两项中的一项相同才能仍然能够使用确认码:
- 应用程序池
- 机器钥匙
http://gunaatita.com/Blog/How-to-Generate-Machine-Key-using-IIS/1058
我有一个使用相同数据库的服务项目 (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 网站对其进行验证。 在这里它给了我 "Invalid Token".
我认为这是由于令牌代码不匹配,我尽量使它们相同,但真的不知道 Wcf 和 MVC 之间的哪个位置。
顺便说一句。我正在 Visual studio.
的本地主机上进行测试我找到了解决办法。问题是 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 创建 URL 时,我们需要使用
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));
更新
对于尝试托管多个项目的任何人,您需要以下两项中的一项相同才能仍然能够使用确认码:
- 应用程序池
- 机器钥匙
http://gunaatita.com/Blog/How-to-Generate-Machine-Key-using-IIS/1058