Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使ASP.NET Identity 2.0电子邮件确认令牌适用于WCF和MVC_C#_Asp.net Mvc_Wcf_Asp.net Identity_Asp.net Identity 2 - Fatal编程技术网

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

C# 使ASP.NET Identity 2.0电子邮件确认令牌适用于WCF和MVC,c#,asp.net-mvc,wcf,asp.net-identity,asp.net-identity-2,C#,Asp.net Mvc,Wcf,Asp.net Identity,Asp.net Identity 2,我有一个使用相同数据库的服务项目(WCF)和MVC项目,用于处理移动设备的服务部分和接口部分。我必须在这两个网站上设置电子邮件确认 我在ASP.NET 2.0库中使用了OWIN进行身份验证,两个项目都有单独的用户管理器 对于MVC public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) { va

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

我在ASP.NET 2.0库中使用了OWIN进行身份验证,两个项目都有单独的用户管理器

对于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"));
  }
}
公共静态应用程序服务器管理器创建(IdentityFactoryOptions选项,IOwinContext上下文)
{
var dataProtectionProvider=options.dataProtectionProvider;
if(dataProtectionProvider!=null)
{
manager.UserTokenProvider=newdataprotectortokenprovider.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);
var provider=new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider(“ASP.NET”);
UserManager.UserTokenProvider=新的Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider(
创建(“电子邮件确认”);
var code=idManager.UserManager.GenerateEmailConfirmationToken(appuser.Id);
问题 MVC中生成的电子邮件确认令牌工作正常

在WCF中,当我创建电子邮件确认令牌时,需要从MVC网站进行验证。 这里它给了我“无效令牌”

我认为这是由于令牌代码不匹配,我试图使它们尽可能地相同,但不知道哪一个在Wcf和MVC之间


顺便说一句,我正在Visual studio的localhost上进行测试。

我找到了解决方案。问题是
数据保护提供程序

在MVC上,它来自:

public static ApplicationUserManager    
    Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
    {
      var dataProtectionProvider = **options.DataProtectionProvider**;
所以我在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));

更新

对于任何试图主持多个项目的人,您需要这两件事中的一件保持不变,才能使用确认代码:

  • 应用程序池
  • 机器钥匙

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));