.NET Standard 2.0 中的 Microsoft.AspNet.Identity 和 Microsoft.AspNet.Identity.EntityFramework

Microsoft.AspNet.Identity and Microsoft.AspNet.Identity.EntityFramework in .NET Standard 2.0

背景:我们正在进行的项目包含几个共享两个库的解决方案。今天全部写在.NET Framework 4.6.1。该项目的目标是为新项目采用 .NET Core 并能够在 Docker 中使用 运行 Web 应用程序。

随着 .NET Standard 2.1 的新发布以及 .NET Framework 4.8 将保留在 .NET Standard 2.0 而不是实施 .NET Standard 2.1 的事实,感觉是时候开始了。 Microsoft 的 Immo Landwerth 是这样说的:

But what is also true is that the rate of innovation in .NET Framework has to slow down in order to reduce breakage. In that sense, you should generally expect that most new features will only become available on .NET Core (and derived platforms, such as Xamarin, Mono, and Unity as they build from the same sources as .NET Core).

https://blogs.msdn.microsoft.com/dotnet/2018/11/05/announcing-net-standard-2-1/

我们希望在我们的新项目中使用新功能,但不想将每个旧项目都转换为 .NET Core。为了保持 .NET Framework.NET Core 之间的兼容性,我们决定将我们的共享库转换为 .NET Standard 2.0

https://docs.microsoft.com/en-us/dotnet/standard/net-standard

除了以下依赖项之外,它的效果非常好:

1. System.Net.Http.WebRequestHandler - 已解决

用于这样的客户端证书:

WebRequestHandler requestHandler = new WebRequestHandler();

//Add certificate if setting exists
if (!string.IsNullOrEmpty(pushEvent?.CertificateThumbprint?.Thumbprint))
{
    var certificate = certificateService.GetClientCertificate(pushEvent?.CertificateThumbprint?.Thumbprint);
    if (certificate != null)
    {
        requestHandler.ClientCertificates.Add(certificate);
    }
}

var client = new HttpClient(requestHandler);

我找到了它的 NuGet,但它似乎是恶意的。该包链接到 Microsoft 文档作为 Project Site,并将 Microsoft 拼错为作者 Microsfot。已报告,以便 Microsoft 可以查看。

https://www.nuget.org/packages/WebRequest.WebRequestHandler/

不过,我们似乎可以将 WebRequestHandler 更改为 HttpClientHandler 以使其开箱即用。

2。 System.Runtime.Remoting.Messaging -> CallContext.LogicalGetData - 已解决

已在此处解决:

3。 Microsoft.AspNet.Identity.EntityFramework.IdentityUser

我们有一个继承自 IdentityUser 的用户模型。

public class AppUser : IdentityUser, ICurrentUser
{
    public bool LocalEnvironment { get; set; }

    public Guid? TokenId { get; set; }
}

4. Microsoft.AspNet.Identity.UserManager 来自程序集 Microsoft.AspNet.Identity.Core

我们保持 UserManager 在项目之间共享。 Container 来自 SimpleInjector,与 .NET Standard 2.0.

兼容
public class AppUserManager : UserManager<AppUser>
{

    public AppUserManager(IUserStore<AppUser> store)
        : base(store)
    {

    }

    public static AppUserManager Create<AppContainer>() where AppContainer : Container, new()
    {
        var container = new AppContainer();
        var store = container.GetInstance<IUserStore<AppUser>>();

        var manager = new AppUserManager(store);

        manager.UserValidator = new UserValidator<AppUser>(manager)
        {
            AllowOnlyAlphanumericUserNames = false
        };


        return manager;
    }
}

如果 EntityFramework NuGet 安装在共享库中,则会出现以下警告。我们不能冒险。

Package 'EntityFramework 6.2.0' was restored using '.NETFramework,Version=v4.6.1' instead of the project target framework '.NETStandard,Version=v2.0'. This package may not be fully compatible with your project.

我读过为什么他们将 IdentityUser 放在 EF 库中,IdentityUser 是非常特定于 EF 的。然而,它使移植到 .NET Standard 2.0. 变得更加困难。

我还读到 ASP.NET Core 2.0 已经删除了基础 IdentityUser POCO(普通旧 CLR 对象)。

Microsoft.AspNetCore.IdentityMicrosoft.AspNetCore.Identity.EntityFrameworkCore 只依赖于 .NETStandard 2.0 并且可以在没有警告的情况下安装。我们需要将 Entity Framework 和 ASP.NET 上的 Identity 升级到 Core 还是有其他方法让它与 .NET Standard 一起工作?我们需要得到它的最后一步 运行ning.

https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x?view=aspnetcore-2.1

https://docs.microsoft.com/en-us/ef/efcore-and-ef6/side-by-side

考虑到我们只需要 EntityFramework 6.2.0 即可同时使用 .NET Framework.NET Core 这将在 .NET Core 3 中解决。

.NET Core 3 is a major update which adds support for building Windows desktop applications using Windows Presentation Foundation (WPF), Windows Forms, and Entity Framework 6 (EF6).

https://blogs.msdn.microsoft.com/dotnet/2018/12/04/announcing-net-core-3-preview-1-and-open-sourcing-windows-desktop-frameworks/