繁体   English   中英

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 服务然后创建用户、他们的确认令牌并发送电子邮件。

用户在单击链接时会在 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 方面我有

自动法

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

我已经尝试并发现了什么”:

  • 它在本地主机(开发环境)上运行良好
  • 我尝试了来自 So 和下面列出的其他资源的许多建议
  • 当我登录 Windows 服务和 AccountController 时,令牌本身很好。 记录它们时它们匹配
  • 我检查了 DataProtectionProvider AppName 和用途的命名
  • 我是base 64编码令牌,所以url编码等没有问题,如许多SO答案所述
  • 我现在唯一能看到的真正区别是生产在 SSL 上运行,而 localhost 没有
  • 生产环境在同一台机器上拥有所有应用程序,没有负载均衡器设置或类似的东西

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

MachineKeyDataProtector - 通过后台作业发送确认 email 时链接无效

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

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

帮助我解决它的相关帖子:

MachineKeyDataProtector - 通过后台作业发送确认 email 时链接无效

生成重置密码令牌在 Azure 网站中不起作用

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

在 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 中

自动法

        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>

并在寡妇服务的app.config中添加同样的内容

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM