在使用OWIN请求管道创建ApplicationUserManager时,使用依赖项注入创建自定义UserStore时遇到问题.
背景
我正在尝试将我们的Web应用程序中的用户功能从使用SimpleMembership迁移到新的ASP.NET标识.在启动新的MVC 5项目时,单页面应用程序的默认实现使用ASP.Identity,使用Entity Framework实现UserStore功能.
在我的例子中,我们已经使用NHibernate作为ORM,并使用ninject实现工作单元模式,以便每个请求有一个NHibernate会话,我想让ASP.Identity与我们现有的框架一起工作.
为此,我创建了一个自定义UserStore,可以通过注入相关的存储库/ nhibernate会话等来创建.然后可以使用Ninject将其注入Controller的构造函数,而不是使用默认实现的GetOwinContext功能.
为了做到这一点,我在Startup的ConfigureAuth(IAppBuilder app)方法中注释掉了以下行,默认情况下会创建UserManager类:
// app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
Run Code Online (Sandbox Code Playgroud)
相反,我使用了在安装Ninject.Web.Common.Webhost nuget包时创建的NinjectWebCommon来创建相关的绑定.
这个实现在一些UserManager操作中运行良好,但是对于一些操作,例如ResetPasswordAsync,它失败了,因为没有调用默认的ApplicationUserManager实现,因此从未设置UserManager类中的UserTokenProvider:
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
// Register two factor authentication providers. …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个基本记录类型,它将使用Equals()值相等的不同实现,因为它将使用比较集合对象SequenceEqual(),而不是通过引用比较它们。
但是,Equals() 的实现并不像我期望的继承那样工作。
在下面的示例中,我有一个派生类,它有两个不同的列表。在相等性的默认实现下,这些记录是不同的,因为它是通过引用相等性而不是序列相等性来比较列表。
Equals()如果我覆盖基本记录上的默认实现以始终返回true,单元测试将失败,即使代码正在调用RecordBase.Equals(RecordBase obj)。
public abstract record RecordBase
{
public virtual bool Equals(RecordBase obj)
{
return true;
}
}
public record DerivedRecord : RecordBase
{
public DerivedRecord(ICollection<int> testCollection)
{
TestCollection = testCollection;
}
public ICollection<int> TestCollection { get; init; }
}
public class RecordTests
{
[Fact]
public void Equals_WhenCollectionHasSameValues_ReturnsTrue()
{
var recordTest1 = new DerivedRecord(new List<int>() { 1, 2, 3 });
var recordTest2 = new DerivedRecord(new List<int>() { 1, …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的站点从 Azure DevOps Services 部署到应用服务。但是,当我尝试部署站点时,部署 Azure 应用服务任务失败并显示错误消息:
错误:错误代码:ERROR_DESTINATION_NOT_REACHABLE 更多信息:无法连接到远程计算机(“{my-website}.scm.azurewebsites.net”)。在远程计算机上,确保安装了 Web Deploy 并启动了所需的进程(“Web 管理服务”)。了解更多信息:http : //go.microsoft.com/fwlink/?LinkId=221672#ERROR_DESTINATION_NOT_REACHABLE。
复制步骤:
发布管道的日志显示它在 msdeploy.exe (ComputerName='https://{my-website}.scm.azurewebsites.net:443/msdeploy.axd?site=dotnetcore-webpack-test' ) 步骤与上述错误,由于 404。
https://{my-website}.scm.azurewebsites.net:443 将带我到 kudu 仪表板,但路由 /msdeploy.exe 返回一个页面,显示“没有为‘/msdeploy.axd’注册路由”
根据错误消息中的链接,此错误是由“远程计算机上未安装或无法访问 Web 管理服务或远程代理”引起的。
但是,我正在尝试部署到应用服务,而不是虚拟机,以及我一直在尝试遵循的所有教程,它似乎开箱即用,无需配置 Web 管理服务/防火墙设置等。
我是否遗漏了一步或做错了什么?我很感激有关如何进一步解决此问题的任何建议。
我正在尝试部署一个简单的“Hello World!” 使用 Azure 门户部署中心将 .NET Core MVC 3.1 Web 应用程序连接到 Azure 应用服务。
我使用 .Net Core 版本 3.1 创建了一个应用程序。(Visual Studio 2019 下拉列表中只有版本 3.1,而不是 3.0。)
Visual Studio 2019 创建向导下拉列表:
但是部署中心尚不支持此功能。您可以在添加创建应用服务计划时选择运行时堆栈 3.1 (LTS),但当您尝试使用部署中心创建 CI/CD 管道时,会出现错误:“source.buildConfiguration.version: Property 'source. buildConfiguration.version' 具有无效/不受支持的值“LTS””
如果我将 Web 应用程序降级到版本 3.0,并使用 Azure 门户部署中心(从我的 Azure Repo 构建)创建 3.0 的应用程序服务/部署管道,它表示部署已成功,但它仍然显示默认站点,不是我的“Hello World!” 地点。
Azure Devops Services 表明部署已成功:

鉴于没有错误消息,我不确定如何最好地调试部署中出现的问题。任何意见,将不胜感激。
azure ×2
c# ×2
deployment ×2
.net-core ×1
asp.net ×1
azure-devops ×1
equality ×1
inheritance ×1
ninject ×1
owin ×1
record ×1