ASP.Net 身份 2 与 windows 服务和 MVC,令牌问题

ASP.Net identity 2 with windows service and MVC, Token issues

我在同一个解决方案中有一个 windows 服务、一个 MVC 应用程序和一个 Webforms Web 应用程序。我正在尝试从 Webforms 向用户发送密码确认电子邮件。 Webforms 应用程序通过 MSMQ 向 Windows 服务(消息消费者)发送消息。 Windows 服务然后创建一个用户、他们的确认令牌并发送电子邮件。

用户在单击 link 时会在 MVC 应用程序上确认他们的电子邮件。所有这些在我的开发机器上运行良好。

每当我在生产环境中部署时,我都会遇到无效令牌问题。

我的设置中的一些相关代码:

在 Windows 服务中:

Autofac 配置

builder.Register(c => new UserManager<User, long>(new UserStore(new DbEntities()))).InstancePerLifetimeScope();

在创建令牌和电子邮件的方法中

构造函数

    private readonly UserManager<User, long> _usermanager;
    private readonly IUnitOfWork _uow;
    public ConfiguratorUserService(IUnitOfWork uow)
    {
        _uow = uow;
        _usermanager = new UserManager<User, long>(new UserStore((DeronEntities)_uow.Context));
        var provider = new DpapiDataProtectionProvider("DeronConfigurator");
        _usermanager.UserTokenProvider = new DataProtectorTokenProvider<User, long>(provider.Create("Passwords"));
    }

方法

 var user = new User
 {
     ... more props setting
     UserName = contact.Emailadres,
 };
 _usermanager.Create(user);
 var provider = new DpapiDataProtectionProvider("Configurator");
 _usermanager.UserTokenProvider = new DataProtectorTokenProvider<User, long>(provider.Create("Passwords"));
 var token = _usermanager.GenerateEmailConfirmationToken(user.Id);
 var data = Encoding.UTF8.GetBytes(token);
 var base64EncodedToken = System.Convert.ToBase64String(data);
 // And sending the e-mail here

然后在 MVC 端我有

Autofac

builder.Register(c => new UserManager<User, long>(new UserStore(new DeronEntities()))).InstancePerLifetimeScope();

授权设置(启动)

var provider = new DpapiDataProtectionProvider("Configurator");

app.CreatePerOwinContext(() => new UserManager(new UserStore(new DeronEntities()))
{
     UserTokenProvider = new DataProtectorTokenProvider<User, long>(provider.Create("Passwords"))
});

账户控制器

var data = Convert.FromBase64String(code);
var base64Decoded = Encoding.UTF8.GetString(data);

var result = await UserManager.ConfirmEmailAsync(userId, base64Decoded);

我尝试并发现了什么":

尝试过的解决方案: http://www.gunaatita.com/blog/Invalid-Token-Error-on-Email-Confirmation-in-Aspnet-Identity/1056

我不确定如何为 Windows 服务设置机器密钥用法

我已经解决了这个问题。它是通过使用机器密钥设置。

帮助我解决问题的相关帖子:

Generating reset password token does not work in Azure Website

所以我的设置现在看起来像这样:

在Windows服务中

Autofac 配置:

builder.Register<IUserTokenProvider<User, long>>(c => DataProtector.TokenProvider).InstancePerLifetimeScope();

builder.RegisterType<UserManager<User, long>>()
                .As<UserManager<User, long>>().InstancePerLifetimeScope(); 

并且在构造函数中:

    private readonly IUnitOfWork _uow;
    private readonly UserManager<User, long> _usermanager;

    public ConfiguratorUserService(UserManager<User, long> userManager, IUnitOfWork uow)
    {
        _uow = uow;
        _usermanager = userManager;
    }

在 MVC 中

Autofac

        builder.Register(c => new UserManager<User, long>(new UserStore(new DeronEntities()))).InstancePerLifetimeScope();

        builder.Register<IUserTokenProvider<User, long>>(c => DataProtector.TokenProvider).InstancePerRequest();

我从链接的帖子中获取了 MachineKeyProtectionProvider

在您的 web.config 机器密钥中添加:

  <system.web>
      <machineKey decryption="AES" decryptionKey="dec key here" validation="HMACSHA256" validationKey="key here"/>
  </system.web>

并在widows服务的app.config中添加相同的