调用AssemblyResolve函数时出现防伪造错误



我正在向AssemblyResolve添加我自己的自定义加载器,以加载。net库中的一些嵌入式资源;

AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => { return Domain.Assemblies.LoadResource(e.Name, System.Reflection.Assembly.GetExecutingAssembly()); };
public static System.Reflection.Assembly LoadResource(string fileName, System.Reflection.Assembly assembly)
{
fileName = assembly.GetName().Name + "." + fileName.Split(',')[0] + ".dll";
var resFilestream = assembly.GetManifestResourceStream(fileName);
byte[] ba = new byte[resFilestream.Length];
resFilestream.Read(ba, 0, ba.Length);
var byteArray = ba;
resFilestream.Close();
resFilestream.Dispose();
return System.Reflection.Assembly.Load(byteArray);
}

这工作在许多不同的环境(Winforms, Azure应用程序/webjobs/函数),但当我试图执行这段代码在asp.net(4.7.2) MVC网站,它打破了防伪?这个问题似乎与DLL没有正确加载有关,并导致三个独立的错误

TypeInitializationException: The type initializer for 'System.Web.Helpers.Claims.ClaimsIdentityConverter' threw an exception.
FileLoadException: Could not load file or assembly 'Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. Invalid pointer (Exception from HRESULT: 0x80004003 (E_POINTER))
NullReferenceException: Object reference not set to an instance of an object.

如果我删除了在程序集加载dll中初始化类的对象,则站点可以正常工作而不会出错。如果我把它放回去,它就坏了。我也试过从全局移动代码。当你运行c#时,下次加载带有伪造令牌的页面也会以同样的方式出错。

UPDATE运行Fusion++检查DLL加载,我可以看到错误的DLL实际上在两种情况下都有完全相同的加载失败(相当通用的"无法找到汇编")。但只有当我加载DLL时,它才会显示为异常。

问题不在于你的代码,而在于对微软的依赖。IdentityModel:存在这种依赖关系和可能消费到Windows客户端环境,可能dll和依赖关系需要安装在GAC(全局程序集缓存);如果微软。IdentityModel在GAC文件夹中不存在,代码返回错误。

Windows Identity Foundation 3.5Windows Identity Foundation 3.5.

最新更新