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);
我尝试并发现了什么":
- 它在本地主机(开发环境)上工作正常
- 我已经尝试了 So 和下面列出的其他资源的许多建议
- 当我登录 Windows 服务和 AccountController 时,令牌本身没有问题。它们在记录时匹配
- 我检查了 DataProtectionProvider AppName 和用途的命名
- 我是 base 64 编码令牌,所以 url 编码等没有问题,如许多 SO 答案所述
- 我现在能看到的唯一真正区别是生产运行在 SSL 上而本地主机没有
- 生产环境在同一台机器上有所有应用程序,没有负载平衡器设置或类似的东西
尝试过的解决方案:
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中添加相同的
我在同一个解决方案中有一个 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);
我尝试并发现了什么":
- 它在本地主机(开发环境)上工作正常
- 我已经尝试了 So 和下面列出的其他资源的许多建议
- 当我登录 Windows 服务和 AccountController 时,令牌本身没有问题。它们在记录时匹配
- 我检查了 DataProtectionProvider AppName 和用途的命名
- 我是 base 64 编码令牌,所以 url 编码等没有问题,如许多 SO 答案所述
- 我现在能看到的唯一真正区别是生产运行在 SSL 上而本地主机没有
- 生产环境在同一台机器上有所有应用程序,没有负载平衡器设置或类似的东西
尝试过的解决方案: 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中添加相同的