在 Visual Studio 中调用外部 Web 服务时出现安全错误

2024-03-22

我试图在 Visual Studio 中调用外部 Web 服务,但收到错误消息。

System.Security.SecurityException:请求“System.Security.Permissions.SecurityPermission,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”类型的权限失败。 系统.安全.安全异常: 在 System.Security.CodeAccessSecurityEngine.Check(对象需求,StackCrawlMark& stackMark,Boolean isPermSet) 在 System.Security.CodeAccessPermission.Demand() 在 System.Net.ServicePointManager.set_ServerCertificateValidationCallback(RemoteCertificateValidationCallback 值)

以下是调用Web服务的程序。

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
    [return: SqlFacet(MaxSize = -1)]
    public static SqlString NYP_RestGet(SqlString uri)
    {
        String document;
        System.Net.ServicePointManager.ServerCertificateValidationCallback +=
        delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                                System.Security.Cryptography.X509Certificates.X509Chain chain,
                                System.Net.Security.SslPolicyErrors sslPolicyErrors)
        {
            return true; // **** Always accept
        };

        // Set up the request, including authentication
        WebRequest req = WebRequest.Create(Convert.ToString(uri));
        ((HttpWebRequest)req).UserAgent = "CLR web client on SQL Server";
        req.ContentType = "application/xml";
        ((HttpWebRequest)req).Accept = "application/xml";

        WebResponse resp = req.GetResponse();
        Stream dataStream = resp.GetResponseStream();
        StreamReader rdr = new StreamReader(dataStream);
        document = (String)rdr.ReadToEnd();


        rdr.Close();
        dataStream.Close();
        resp.Close();
         return (document);
    }
};

对于网络相关的请求本身,您需要将程序集设置为PERMISSION_SET = EXTERNAL_ACCESS。然而,使用System.Net.ServicePointManager.ServerCertificateValidationCallback不幸的是需要PERMISSION_SET = UNSAFE。如果您没有明确需要覆盖 SSL 证书的处理,那么您应该删除该委托,因为最好将程序集设置为EXTERNAL_ACCESS.

不幸的是,Visual Studio / SSDT(SQL Server Data Tools)并不能很容易地采取适当的步骤来允许您的程序集设置为EXTERNAL_ACCESS or UNSAFE。然而,它们确实可以很容易地设置TRUSTWORTHY选项ON,这主要是一个坏主意。

请这样做not set TRUSTWORTHY ON除非绝对必要!并且只有在加载您未构建且无法重新签名的程序集时才应该是“必要的”。这种情况主要发生在加载不受“支持”的 .NET Framework 库(因此尚未在 SQL Server 的 CLR 主机中)时。除这些情况外,您不应将数据库设置为TRUSTWORTHY ON因为它打开了一个安全漏洞。

相反,最好执行以下操作:

USE [master];

CREATE ASYMMETRIC KEY [SomeKey]
  AUTHORIZATION [dbo]
  FROM EXECUTABLE FILE = 'C:\path\to\Some.dll';

CREATE LOGIN [SomeLogin]
  FROM ASYMMETRIC KEY [SomeKey];

GRANT EXTERNAL ACCESS ASSEMBLY TO [SomeLogin]; -- or "UNSAFE" instead of "EXTERNAL ACCESS"

上述操作只需针对每个实例、每个键执行一次。所以如果你使用相同的snk / pfx为所有程序集创建一个文件,然后每个 SQL Server 实例只需执行上面显示的步骤一次;程序集和包含这些程序集的数据库的数量并不重要。

这种方法允许您保持数据库的更好安全性(通过保持TRUSTWORTHY set to OFF)并允许更精细地控制哪些程序集甚至允许设置为EXTERNAL_ACCESS and/or UNSAFE(因为您可以通过使用不同的密钥进行签名和基于这些不同密钥的登录来分开)。

有关安全选项的更详细的演练,请参阅我在 SQL Server Central 上撰写的以下文章:通往 SQLCLR 4 级的阶梯:安全性(外部和不安全的程序集) http://www.sqlservercentral.com/articles/Stairway+Series/112888/(需要免费注册)。


其他注意事项:

  1. 有关通过 SQLCLR 调用 Web 服务和网页的更多说明,请参阅我的回答:从 SQL CLR 调用 Web 服务? https://stackoverflow.com/questions/32875954/call-web-service-from-sql-clr/32877528#32877528
  2. 没有必要使用Convert.ToString(uri)。全部Sql*类型有一个.Value返回适当的本机类型的属性。所以将其替换为uri.Value.
  3. 你不需要DataAccess = DataAccessKind.Read in the SqlFunction属性,因为您没有进行任何数据访问。环境DataAccess = DataAccessKind.Read对性能有轻微影响,因此由于您没有使用它,因此将其删除。
  4. dataStream and rdr(成为一个Stream and StreamReader分别)是“一次性”对象,所以你真的需要调用.Dispose()在他们身上,你可能可以这样做而不是.Close().
  5. 您没有任何错误处理,这意味着如果在Dispose在这两个对象上调用方法时,您的进程可能会保持打开外部网络句柄,并且在应用程序域回收之前可能不会释放该句柄,而这可能不会持续很长时间。您需要使用using构造或正确构造一个try / catch / finally。在 SQL Server 中运行而不执行这两件事之一的代码是相当危险的。
  6. 有关使用 SQL Server 的 CLR 主机的各种细微差别的更多详细信息,请参阅我的文章:SQLCLR 5 级阶梯:开发(在 SQL Server 中使用 .NET) http://www.sqlservercentral.com/articles/Stairway+Series/119429/(需要免费注册)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Visual Studio 中调用外部 Web 服务时出现安全错误 的相关文章

随机推荐

  • Visual Studio 2012 JavaScript 智能感知不工作

    我的笔记本电脑和台式机上安装了 Visual Studio 2012 在我的台式电脑上 JavaScript 智能感知无法正常工作 对于它提取的任何方法 甚至是标准 JavaScript 调用 我都会收到消息 Intellisense 无法
  • 如何将 Html.Action 附加到 jquery

    我可以添加吗 report html Html Action ReportPage new id Model GoalId 这里的报告是我想要放置操作结果的div的id ReportPage id是传递给ReportPage actionr
  • 如何在 eclipse 中添加 Android Support v7 库?

    如何在 eclipse 中添加 Android 支持 v7 库 例如 如何将 CardView 添加到 eclipse android 项目 注意 这是一个自我回答问题 因此无需浪费时间回答 当然 如果您有什么需要补充的 欢迎补充 From
  • 水豚在我的电脑中打开一个html文件

    我的电脑中有一个 html 文件 我想使用 Capybara 打开该文件来测试它 你能帮我解决这个问题吗 P S 该 html 文件是在我的应用程序中自动创建的 我非常感谢任何帮助我解决这个问题的想法 谢谢 UPDATE 基于水豚源码her
  • HttpClient 中“连接被拒绝”异常和超时之间的区别

    我正在尝试确定网络上的设备是否正在使用 Java 运行 Web 服务器 为此 我使用 Apache 的 HttpClient 我发送一个请求 如果设备运行网络服务器 我就会收到响应 非常简单 但是 如果网络服务器没有运行 那么我观察到会发生
  • iPhone KERN_INVALID_ADDRESS

    我不确定为什么会收到此错误 并且无法找出原因 不过 这只发生在设备上 模拟器按预期运行 没有错误 有人能理解这个崩溃日志吗 Exception Type EXC BAD ACCESS SIGSEGV Exception Codes KERN
  • 将数组作为 axios 请求中的参数传递

    我需要通过以下方式提出请求axios 其中我想将这种类型的数组作为数组传递 1 2 3 4 我需要这些数据从我的后端进行选择查询 我的问题是 我应该使用GET or POST请求以及传递该数组的正确方法是什么 你可以POST它作为 json
  • Netbeans 分析器的“Self Time”实际上是什么意思?

    我一直对我的简单游戏需要运行的时间感兴趣 因此我使用了 Netbeans Java 分析器 Java 1 7 并且我可以在 热点 选项卡中看到 Self Time 和 Inspirations 列 例如 我的渲染方法有 自拍时间 1025
  • 如何向表单添加两个“on Submit=”值?

    我正在尝试使用两个单独的 JavaScript 函数来验证我的表单
  • 防止 mysql 在 where 子句中将字符串转换为 int

    我试图阻止 mysql 在 where 子句中将字符串转换为 int 以下查询返回订单的正确行 SELECT delivery name FROM orders WHERE orders id 985225 以下查询也返回与将我的字符串转换
  • 如何移动张量中的值

    我有形状为 batch size A 的张量 T 和形状 batch size 的张量 S 和移位参数 我想将 T b 中的值向右移动 S b 个位置 应删除 T b 的最后一个 S b 元素 并将新元素设置为 0 所以基本上想做类似的事情
  • 导入错误:没有名为“队列”的模块[重复]

    这个问题在这里已经有答案了 我正在尝试导入requests模块 但我收到此错误 我的python版本是3 4 在ubuntu 14 04上运行 gt gt gt import requests Traceback most recent c
  • 在 xCode 界面生成器中,是否可以使用 control+drag 将视图元素与文件所有者连接起来?

    通过 TightVNC 连接到 Mac Mini 来处理 iPhone 应用程序 Interface Builder 中用于将视图元素连接到文件所有者的控制 拖动操作不起作用 我没有看到连接线 当我将键盘 鼠标和显示器连接到 Mini 并直
  • 在启用 ARC 的 iOS 上将 CALayer 的内容设置为 CGImageRef

    以下代码在手动内存管理下可以正常编译 但在 ARC 下会失败 CALayer layer CALayer layer layer contents UIImage imageNamed dial png CGImage 错误是 自动引用计数
  • 按特定顺序排列的订购列表

    我有一个List我有新的顺序List应该有以下项目int 我想要该项目List应根据中的项目重新订购int 这是我执行此操作的代码 class Program static void Main string args List
  • Django 多数据库路由

    我一直在使用手动数据库选择来处理具有两个独立数据库的项目 我已经在设置中定义了我的数据库 经过进一步阅读后 似乎数据库路由实际上是解决此问题的方法 然而 在阅读了这里的文档和一些相关帖子后 我比以往任何时候都更加困惑 在我的设置中我有 DA
  • this 在箭头函数内未定义

    我试图在我的箭头函数中访问它 import myObject from myObjectPath export const myClass Fluxxor createStore initialize this list this id n
  • OpenWebStart + IcedTea-Web:j2se 元素

    With 开放网络启动 https openwebstart com Java SE 11 我们应该在 j2se 元素中使用什么 URL
  • 我到底如何在 Symfony2/Doctrine 中创建自定义 EntityManager?

    Symfony Doctrine 的新人 所以请指导我 要求 创建一个自定义EntityManager 它将覆盖一些方法 例如删除 而不是删除 我想执行更新并修改类中的isValid等参数 以便永远不会删除记录 和查找 find具有非零 i
  • 在 Visual Studio 中调用外部 Web 服务时出现安全错误

    我试图在 Visual Studio 中调用外部 Web 服务 但收到错误消息 System Security SecurityException 请求 System Security Permissions SecurityPermiss