SSRS REST API 嵌入式数据源凭据设置
SSRS REST API Embedded Data Source Credential Settings
我有一个可行的解决方案,可以使用 POST 请求将 rdl 报告定义部署到报告服务器。这些报告利用嵌入式 XML 数据源,其中将包含目标端点的请求令牌(通过 https),因此不需要任何凭据。 随后,rdl 文件被定义为不需要凭据——这需要设置需要无人参与的执行帐户 才能配置报告不使用凭据。这些报告的部署是成功的,但是,我 运行 遇到了一个初始问题和一个试图修复第一个问题的后续问题:
1) 部署后,SSRS 服务器忽略报告定义数据源凭据设置 "Log into the data source without any credentials",并将数据源设置为提示输入凭据。
2) 作为 #1 中描述的问题的解决方法, 我尝试针对 /Reports(path='/folder/reportname')/DataSources
端点,但是,我无法形成适当的 json 对象来完成请求。
编辑:
仔细检查 GET
响应(包括下面稍加篡改的示例),与嵌入式数据源关联的 Id
似乎毫无意义,并且在每次请求时都会发生变化,但是,试图解决数据源(省略 Id
)似乎也不起作用(我已经更新了之前包含的示例有效负载以省略 ID 并包含数据源的 Name
,但这些请求仍然返回 400 Bad Request
状态代码。
编辑#2:
我对通过 Visual Studio (SSDT) 部署报告的熟悉程度让我忘记了凭据实际上并未定义为报告的一部分,这是不可取的,因为在许多情况下,凭据存储在源代码管理或报告中他们可能受到威胁的服务器。这意味着我应该进行二次 API 调用,但到目前为止,我还没有成功制作一个对象作为有效负载传递给该端点。
针对 /Reports(path='/folder/reportname')/DataSources
的 GET 请求响应示例
{
"@odata.context": "https://my-report-server.com/reports/api/v2.0/$metadata#DataSources",
"value": [
{
"Id": "00000747-020f-019c-e8be-4f8ff834bee5",
"Name": "DebugSource",
"Description": null,
"Path": null,
"Type": "DataSource",
"Hidden": false,
"Size": 0,
"ModifiedBy": null,
"ModifiedDate": "0001-01-01T00:00:00Z",
"CreatedBy": null,
"CreatedDate": "0001-01-01T00:00:00Z",
"ParentFolderId": null,
"ContentType": null,
"Content": "",
"IsFavorite": false,
"Roles": [],
"IsEnabled": true,
"ConnectionString": "https://localhost:8082/some-api-endpoint",
"DataSourceType": "XML",
"IsOriginalConnectionStringExpressionBased": false,
"IsConnectionStringOverridden": false,
"CredentialRetrieval": "prompt",
"CredentialsByUser": {
"DisplayText": null,
"UseAsWindowsCredentials": false
},
"CredentialsInServer": null,
"IsReference": false
},
{
"Id": "000009b9-0093-0257-52cc-e93a261f0862",
"Name": "ActualAPIEndpointForNonDevUse",
"Description": null,
"Path": null,
"Type": "DataSource",
"Hidden": false,
"Size": 0,
"ModifiedBy": null,
"ModifiedDate": "0001-01-01T00:00:00Z",
"CreatedBy": null,
"CreatedDate": "0001-01-01T00:00:00Z",
"ParentFolderId": null,
"ContentType": null,
"Content": "",
"IsFavorite": false,
"Roles": [],
"IsEnabled": true,
"ConnectionString": null,
"DataSourceType": "XML",
"IsOriginalConnectionStringExpressionBased": true,
"IsConnectionStringOverridden": false,
"CredentialRetrieval": "prompt",
"CredentialsByUser": {
"DisplayText": null,
"UseAsWindowsCredentials": false
},
"CredentialsInServer": null,
"IsReference": false
}
]
}
JSON 负载示例:1
(通过修改 GET
针对 /Reports(path='/folder/reportname')/DataSources
的请求的 json 摘录创建)
{
"Name": "DebugSource",
"Description": null,
"Path": null,
"Type": "DataSource",
"Hidden": false,
"Size": 0,
"ModifiedBy": null,
"ModifiedDate": "0001-01-01T00:00:00Z",
"CreatedBy": null,
"CreatedDate": "0001-01-01T00:00:00Z",
"ParentFolderId": null,
"ContentType": null,
"Content": "",
"IsFavorite": false,
"Roles": [],
"IsEnabled": true,
"ConnectionString": "https://localhost/some-endpoint",
"DataSourceType": "XML",
"IsOriginalConnectionStringExpressionBased": false,
"IsConnectionStringOverridden": false,
"CredentialRetrieval": "none",
"CredentialsByUser": {
"DisplayText": null,
"UseAsWindowsCredentials": false
},
"CredentialsInServer": null,
"IsReference": false
}
JSON 负载示例:2(最小)
这将是理想的形式,并且根据 api 文档应该是有效的
{
"Name": "DebugSource",
"CredentialRetrieval": "none"
}
这里的理想解决方案是强制 SSRS 遵循嵌入式数据源设置的设置,但如果我能弄清楚使用正确的语法。
您可以使用 Reports portal 获取所需 json,它使用 api 与 SSRS 交换数据。
我忘了跟进这个问题:
我最终通过 Microsoft 支持解决了这个问题。达到此终点:
http://reportserverurl/reports/api/v2.0/Reports(19489e3b-5653-466a-b242-43e4e198be49)/DataSources
使用这样的有效载荷:
[{
"Name":"DataSourceUpdated",
"Description":null,
"Hidden":false,
"Path":"",
"IsEnabled":true,
"DataSourceSubType":null,
"DataModelDataSource":null,
"IsReference":false,
"DataSourceType":"SQLAZURE",
"ConnectionString":"Data Source=someting;Initial Catalog=rsadventureworks;Encrypt=True;TrustServerCertificate=False",
"IsConnectionStringOverridden":true,
"CredentialRetrieval":"store",
"CredentialsInServer":
{
"UserName":"something",
"Password":"something",
"UseAsWindowsCredentials":false,
"ImpersonateAuthenticatedUser":false
},
"CredentialsByUser":null
}
]
当时在我的测试中对我有用,尽管我还没有在我的部署解决方案中实现它(我最初使用旧版 soap api 因为这个问题拖了一段时间)。
我有一个可行的解决方案,可以使用 POST 请求将 rdl 报告定义部署到报告服务器。这些报告利用嵌入式 XML 数据源,其中将包含目标端点的请求令牌(通过 https),因此不需要任何凭据。 随后,rdl 文件被定义为不需要凭据——这需要设置需要无人参与的执行帐户 才能配置报告不使用凭据。这些报告的部署是成功的,但是,我 运行 遇到了一个初始问题和一个试图修复第一个问题的后续问题:
1) 部署后,SSRS 服务器忽略报告定义数据源凭据设置 "Log into the data source without any credentials",并将数据源设置为提示输入凭据。
2) 作为 #1 中描述的问题的解决方法, 我尝试针对 /Reports(path='/folder/reportname')/DataSources
端点,但是,我无法形成适当的 json 对象来完成请求。
编辑:
仔细检查 GET
响应(包括下面稍加篡改的示例),与嵌入式数据源关联的 Id
似乎毫无意义,并且在每次请求时都会发生变化,但是,试图解决数据源(省略 Id
)似乎也不起作用(我已经更新了之前包含的示例有效负载以省略 ID 并包含数据源的 Name
,但这些请求仍然返回 400 Bad Request
状态代码。
编辑#2: 我对通过 Visual Studio (SSDT) 部署报告的熟悉程度让我忘记了凭据实际上并未定义为报告的一部分,这是不可取的,因为在许多情况下,凭据存储在源代码管理或报告中他们可能受到威胁的服务器。这意味着我应该进行二次 API 调用,但到目前为止,我还没有成功制作一个对象作为有效负载传递给该端点。
针对 /Reports(path='/folder/reportname')/DataSources
{
"@odata.context": "https://my-report-server.com/reports/api/v2.0/$metadata#DataSources",
"value": [
{
"Id": "00000747-020f-019c-e8be-4f8ff834bee5",
"Name": "DebugSource",
"Description": null,
"Path": null,
"Type": "DataSource",
"Hidden": false,
"Size": 0,
"ModifiedBy": null,
"ModifiedDate": "0001-01-01T00:00:00Z",
"CreatedBy": null,
"CreatedDate": "0001-01-01T00:00:00Z",
"ParentFolderId": null,
"ContentType": null,
"Content": "",
"IsFavorite": false,
"Roles": [],
"IsEnabled": true,
"ConnectionString": "https://localhost:8082/some-api-endpoint",
"DataSourceType": "XML",
"IsOriginalConnectionStringExpressionBased": false,
"IsConnectionStringOverridden": false,
"CredentialRetrieval": "prompt",
"CredentialsByUser": {
"DisplayText": null,
"UseAsWindowsCredentials": false
},
"CredentialsInServer": null,
"IsReference": false
},
{
"Id": "000009b9-0093-0257-52cc-e93a261f0862",
"Name": "ActualAPIEndpointForNonDevUse",
"Description": null,
"Path": null,
"Type": "DataSource",
"Hidden": false,
"Size": 0,
"ModifiedBy": null,
"ModifiedDate": "0001-01-01T00:00:00Z",
"CreatedBy": null,
"CreatedDate": "0001-01-01T00:00:00Z",
"ParentFolderId": null,
"ContentType": null,
"Content": "",
"IsFavorite": false,
"Roles": [],
"IsEnabled": true,
"ConnectionString": null,
"DataSourceType": "XML",
"IsOriginalConnectionStringExpressionBased": true,
"IsConnectionStringOverridden": false,
"CredentialRetrieval": "prompt",
"CredentialsByUser": {
"DisplayText": null,
"UseAsWindowsCredentials": false
},
"CredentialsInServer": null,
"IsReference": false
}
]
}
JSON 负载示例:1
(通过修改 GET
针对 /Reports(path='/folder/reportname')/DataSources
的请求的 json 摘录创建)
{
"Name": "DebugSource",
"Description": null,
"Path": null,
"Type": "DataSource",
"Hidden": false,
"Size": 0,
"ModifiedBy": null,
"ModifiedDate": "0001-01-01T00:00:00Z",
"CreatedBy": null,
"CreatedDate": "0001-01-01T00:00:00Z",
"ParentFolderId": null,
"ContentType": null,
"Content": "",
"IsFavorite": false,
"Roles": [],
"IsEnabled": true,
"ConnectionString": "https://localhost/some-endpoint",
"DataSourceType": "XML",
"IsOriginalConnectionStringExpressionBased": false,
"IsConnectionStringOverridden": false,
"CredentialRetrieval": "none",
"CredentialsByUser": {
"DisplayText": null,
"UseAsWindowsCredentials": false
},
"CredentialsInServer": null,
"IsReference": false
}
JSON 负载示例:2(最小)
这将是理想的形式,并且根据 api 文档应该是有效的
{
"Name": "DebugSource",
"CredentialRetrieval": "none"
}
这里的理想解决方案是强制 SSRS 遵循嵌入式数据源设置的设置,但如果我能弄清楚使用正确的语法。
您可以使用 Reports portal 获取所需 json,它使用 api 与 SSRS 交换数据。
我忘了跟进这个问题:
我最终通过 Microsoft 支持解决了这个问题。达到此终点:
http://reportserverurl/reports/api/v2.0/Reports(19489e3b-5653-466a-b242-43e4e198be49)/DataSources
使用这样的有效载荷:
[{
"Name":"DataSourceUpdated",
"Description":null,
"Hidden":false,
"Path":"",
"IsEnabled":true,
"DataSourceSubType":null,
"DataModelDataSource":null,
"IsReference":false,
"DataSourceType":"SQLAZURE",
"ConnectionString":"Data Source=someting;Initial Catalog=rsadventureworks;Encrypt=True;TrustServerCertificate=False",
"IsConnectionStringOverridden":true,
"CredentialRetrieval":"store",
"CredentialsInServer":
{
"UserName":"something",
"Password":"something",
"UseAsWindowsCredentials":false,
"ImpersonateAuthenticatedUser":false
},
"CredentialsByUser":null
}
]
当时在我的测试中对我有用,尽管我还没有在我的部署解决方案中实现它(我最初使用旧版 soap api 因为这个问题拖了一段时间)。