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

时间:2018-11-09 11:37:11

标签: c# asp.net .net .net-standard .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的事实,这似乎是正确的开始时间。微软的Immo Landwerth说:

  

但是,事实也是如此,.NET Framework的创新速度   必须减慢速度以减少破损。从这个意义上讲,   通常应该期望大多数新功能只会成为   可以在.NET Core(和衍生平台,例如Xamarin,Mono,   和Unity来自与.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);

我为此找到了一个N​​uGet,但它似乎是恶意的。该软件包以Project Site的形式链接到Microsoft文档,并误认为Microsoft是Microsfot的作者。进行了报告,以便Microsoft可以进行查看。

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

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

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

在这里解决:https://stackoverflow.com/a/53211839/3850405

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.Core中的Microsoft.AspNet.Identity.UserManager

我们在项目之间共享UserManagerContainer来自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已安装在共享库中,则出现以下警告。我们不能冒险。

  

使用以下命令还原了软件包“ EntityFramework 6.2.0”   “ .NETFramework,Version = v4.6.1”,而不是项目目标框架   ``.NETStandard,Version = v2.0''。该软件包可能不完全兼容   与您的项目。

我已经读到了为什么他们将IdentityUser放在EF库中,IdentityUser是非常针对EF的。但是,这使得移植到.NET Standard 2.0.更加困难。

Why is the IdentityUser class in the Microsoft.AspNet.Identity.EntityFramework namespace and not in the Core package?

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

Microsoft.AspNetCore.IdentityMicrosoft.AspNetCore.Identity.EntityFrameworkCore仅与.NETStandard 2.0相关,并且可以安装而不会发出警告。我们是否需要将ASP.NET上的Entity Framework和Identity升级到Core,还是有另一种方法使其与.NET Standard一起使用?我们需要运行它的最后一步。

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

1 个答案:

答案 0 :(得分:0)

鉴于我们只需要EntityFramework 6.2.0.NET Framework.NET Core一起使用,这将在.NET Core 3中解决。

  

.NET Core 3是一个主要更新,它增加了对构建Windows的支持   Windows Presentation Foundation(WPF)的桌面应用程序,   Windows窗体和实体框架6(EF6)。

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