Identityserver4 这是从强名称的.NET DLL引用Thinktecture DLL的好方法吗?
问题: 我正试图帮助一位同事,他想从一个名为MyVBNet.dll的VB.NET dll中引用Thinktecture.IdentityModel.Client.Net45.dll。当我们运行引用MyVBNet.dll的可执行文件时,MyVBNet.dll尝试实例化Thinktecture对象会导致以下异常:Identityserver4 这是从强名称的.NET DLL引用Thinktecture DLL的好方法吗?,identityserver4,Identityserver4,问题: 我正试图帮助一位同事,他想从一个名为MyVBNet.dll的VB.NET dll中引用Thinktecture.IdentityModel.Client.Net45.dll。当我们运行引用MyVBNet.dll的可执行文件时,MyVBNet.dll尝试实例化Thinktecture对象会导致以下异常: FileLoadException was unhandled by user code An exception of type 'System.IO.FileLoadExcept
FileLoadException was unhandled by user code
An exception of type 'System.IO.FileLoadException' occurred in MyVBNet.dll but was not handled in user code
Additional information: Could not load file or assembly 'Thinktecture.IdentityModel.Client.Net45, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. A strongly-named assembly is required. (Exception from HRESULT: 0x80131044)
以下是我添加到MyVBNet.dll中对象的构造函数中的代码,用于重现上述异常:
Dim lobjURI = New Uri("http://localhost:4200/")
Dim lobjOAuth2Client = New Thinktecture.IdentityModel.Client.OAuth2Client(lobjURI)
潜在的解决办法:
我试着解决这个问题,如下所示,然后在Windows 10计算机上的MyVBNet.dll中实例化了Thinktecture OAuth2Client对象。不过,我不知道这是否一个好办法
[1] 在“开始”菜单中找到开发人员命令提示符,并在其上执行[右键单击]>以管理员身份运行
[2] 在生成的窗口中,如果您还没有具有强名称密钥的SNK文件,请键入类似于以下内容的内容以创建SNK文件,示例中为keyPair2.SNK:
sn -k keyPair2.snk
[3] 将Thinktecture DLL复制到一个目录,将开发者命令提示符窗口cd到该目录,然后输入以下内容,其中Thinktecture.IdentityServer3.DLL是Thinktecture DLL的一个示例:
ildasm Thinktecture.IdentityServer3.dll /output:Thinktecture.IdentityServer3.il
move Thinktecture.IdentityServer3.dll Thinktecture.IdentityServer3.dll_Original
ilasm Thinktecture.IdentityServer3.il /dll /res:Thinktecture.IdentityServer3.res /key=keyPair2.snk
gacutil /i Thinktecture.IdentityServer3.dll
[4] 在Visual Studio中,删除对Thinktecture DLL的当前引用,并通过执行[右键单击]>添加引用…>浏览在解决方案资源管理器中要添加引用的程序集的“引用”节点上。然后在C:\Windows\Microsoft.NET\assembly\GACmsil下选择所需的DLL。首先,您或您的同事是否真的需要旧版OAuth2Client?为什么不将最新的Microsoft.IdentityModel.Protocols.OpenIdConnect与Microsoft.Owin.Security.OpenIdConnect及所有相关内容一起使用?您添加了identityserver4标记,因此很可能是您的IdP。它是OpenIdConnect协议的一个实现,而不仅仅是OAuth2.0d\f,感谢您的评论。我不确定我的同事(他在不同的时区)正在使用Thinktecture.IdentityModel.Client.Net45的哪些部分。我实例化OAuth2Client只是为了重现需要强名称程序集的情况。异常。该同事报告说,调用Thinktecture.IdentityModel.Client.Net45中的任何内容都会导致需要使用强名称程序集。例外因此,我或多或少随机地从DLL中选择了一个类来实例化和再现这个问题。我上面描述的潜在解决方法允许我实例化该类。我在StackOverflow上问了这个问题,以防有人对这种情况有意见,即一个强名称的.NET DLL调用一个缺少强名称的第三方DLL。正如我所说,首先要避免在新开发中使用不推荐的东西。这是一条强有力的共同规则。在那个图书馆里并没有什么特别的东西,那个是在官方的、签名的和支持的图书馆里找不到的。。。除了可能是一个方便的用于承载令牌验证的包装器之外,什么都没有。但这是唯一可以找到解决办法的方法,你可以在github上抓取任何东西,然后用自己的签名签名。在哪个国家它有多合法?我不知道,我不是律师。但从技术上讲,没有什么能阻止你这么做。在任何地方都合法的做法是联系业主并要求在您的案例中签署付费支持