使用 pynetdicom 验证 DICOM 连接请求的最佳方法

Best way to validate DICOM connection request with pynetdicom

根据已知主机列表验证请求的 DICOM 连接的首选方法是什么? 我可以连接到 EVT_CONN_OPEN 事件。但是,event.assoc.requestor.info.ae_title 元素始终为空 (b'')。 我从 TCP 网络分析中看到,名称已传输。那么,它在哪里? 验证请求主机的正确方法是什么?

您可以尝试使用 EVT_REQUESTED,它会在关联请求为 received/sent 后触发,此时 AE 标题信息应该可用。不幸的是 EVT_CONN_OPEN 在关联请求之前发生的 TCP 连接上触发。

如果您不喜欢房东的详细信息,您可以使用处理程序通过 event.assoc.acse.send_reject() or abort with event.assoc.abort() 发送关联拒绝消息。

如果您只对根据 AE 标题进行验证感兴趣,您可以使用 AE.require_calling_aet 属性 将关联限制为具有匹配 AE 标题的关联。

为了其他任何查找此内容的人的利益,查找此内容的正确阶段是在 EVT_REQUESTED 事件中。但是,您可能会发现未填写详细信息(它们是在调用处理程序后填充的)。

因此,如果您想在 EVT_REQUESTED 中找到调用者 AE,您需要找到 A_ASSOCIATE 原语并从那里读取它们。因此,例如在您的处理程序中,您可以这样做来拒绝遥控器:

def handle_request(event):
    req_title = event.assoc.requestor.primitive.calling_ae_title.decode('ascii')
    if req_title != 'MyAET':
        event.assoc.acse.send_reject(0x01, 0x01, 0x03)
        return

至少对于 1.5.7。