gpt4 book ai didi

c# - "No IUserTokenProvider is registered"使用结构图依赖注入(inject)时

转载 作者:太空狗 更新时间:2023-10-29 22:58:32 30 4
gpt4 key购买 nike

我有一个 MVC 5 项目,该项目已被修改为使用 int 作为标识的主键,如此 guide 所示

然后我按照 this guide 中的描述启用了电子邮件确认

一切如预期般顺利。然后我安装了 structuremap.mvc5 用于依赖注入(inject)并将修改后的 DefaultRegistry.cs 添加到

public DefaultRegistry() {
Scan(
scan => {
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.AssemblyContainingType(typeof(MyProject.Data.MyDbContext));
scan.With(new ControllerConvention());
});
//For<IExample>().Use<Example>();
For<IUserStore<ApplicationUser, int>>().Use<MyUserStore>().LifecycleIs<HttpContextLifecycle>();
For<IAuthenticationManager>().Use(() => HttpContext.Current.GetOwinContext().Authentication);

}

项目构建良好,但当尝试在站点上注册新用户时,发送电子邮件确认现在抛出异常 System.NotSupportedException:调用 UserManager.GenerateEmailConfirmationTokenAsync(userID) 时未注册 IUserTokenProvider。

private async Task<string> SendEmailConfirmationTokenAsync(int userID, string subject)
{
string code = await UserManager.GenerateEmailConfirmationTokenAsync(userID);
var callbackUrl = Url.Action("ConfirmEmail", "Account",
new { userId = userID, code = code }, protocol: Request.Url.Scheme);
await UserManager.SendEmailAsync(userID, subject,
"Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

return callbackUrl;
}

我是依赖注入(inject)的新手,很确定我做错了什么。我将感谢您的想法和见解。

最佳答案

IUserTokenProvider 默认情况下由 OWIN 插入,但是当您从 DI 容器解析 UserManager 时,提供 IUserTokenProvider 的组件不可用并且该组件未初始化。

您必须在可用时将 token 提供程序分配给全局静态变量,然后在 UserManager 构造函数中重新使用它:

public class AuthConfig
{
public static IDataProtectionProvider DataProtectionProvider { get; set; }

public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
}

public void ConfigureAuth(IAppBuilder app)
{
DataProtectionProvider = app.GetDataProtectionProvider();

// do other configuration
}
}

然后在 UserManager 构造函数的构造函数中重新分配它:

public UserManager(/*your dependecies*/)
{
var dataProtectorProvider = AuthConfig.DataProtectionProvider;
var dataProtector = dataProtectorProvider.Create("My Asp.Net Identity");
this.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser, Guid>(dataProtector)
{
TokenLifespan = TimeSpan.FromHours(24),
};
// other stuff
}

关于c# - "No IUserTokenProvider is registered"使用结构图依赖注入(inject)时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27471363/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com