Provide Authentication to Access JSON Data (Runtime Sample)
- 6 minutes to read
This topic demonstrates two ways to provide a report’s JSON data source with authentication parameters at runtime.
Save Authentication Parameters to the Configuration File
A JsonDataSource object obtains settings from the configuration file. As a result, only the connection name is serialized to the report’s definition. The JsonDataSource‘s JsonSource property is left unset.Save Authentication Parameters to the Report’s Definition
A JsonDataSource object uses a UriJsonSource object assigned to the JsonSource property to specify connection settings. As a result, authentication parameters are serialized to the report’s definition.
Note
These approaches are available in v19.1+. Refer to the Migrate from v18.2 section for information on how to migrate from the approach v18.2.
Tip
Online Example: How to Provide Authentication to Access JSON Data
Save Authentication Parameters to the Configuration File
Extend the application’s connection string with authentication parameters. Use this connection string to create a JsonDataSource object.
Specify a configuration string in your application’s configuration file.
The following connection string illustrates how to specify basic authentication parameters, token-based authentication parameters and query parameters.
<connectionStrings> <add name="JsonConnection" connectionString="Uri=http://northwind.servicestack.net/customers.json; UserName=user;Password=pwd; header:MyAuthHeader1=secretToken1;header:MyAuthHeader2=secretToken2; query:id=123456;query:name=MyName" providerName="JsonSourceProvider" /> </connectionStrings>
Create a JsonDataSource object.
public static JsonDataSource CreateReportDataSourceFromConnectionString() { JsonDataSource jsonDataSource = new DevExpress.DataAccess.Json.JsonDataSource() { // The application's configuration file should include the "JsonConnection" connection string ConnectionName = "JsonConnection" }; return jsonDataSource; }
Assign the JsonDataSource object to your report.
private void CreateReportDataSourceFromConnectionStringButton_Click(object sender, EventArgs e) { // XtraReport1 does not have assigned data sources var report = new XtraReport1(); // Create JsonDataSource from the specified connection string var jsonDataSource = CreateReportDataSourceFromConnectionString(); // Retrieve data to populate the Report Designer's Field List jsonDataSource.Fill(); report.DataSource = jsonDataSource; report.DataMember = "Customers"; new DevExpress.XtraReports.UI.ReportDesignTool(report).ShowDesigner(); }
Save Authentication Parameters to the Report’s Definition
Use the UriJsonSource object to specify authentication parameters. Assign this object to the JsonDataSource’s JsonSource property.
Create a UriJsonSource object and specify authentication parameters in it.
- The UriJsonSource.AuthenticationInfo property provides access to basic HTTP authentication credentials (the Username and Password).
- The UriJsonSource.HeaderParameters property stores a collection of HTTP header parameters. The code sample below uses header parameters to store authentication tokens.
- The UriJsonSource.QueryParameters property stores a collection of HTTP query parameters. The code sample below uses query parameters to pass custom authentication information to the JSON web service endpoint.
public static JsonDataSource CreateReportDataSourceWithAuthenticationInCode() { // ... // Create a new UriJsonSource object and configure authentication data in it var jsonSource = new DevExpress.DataAccess.Json.UriJsonSource(); jsonSource.Uri = new Uri(@"http://northwind.servicestack.net/customers.json"); jsonSource.AuthenticationInfo.Username = "user"; jsonSource.AuthenticationInfo.Password = "pwd"; jsonSource.HeaderParameters.Add(new HeaderParameter("MyAuthHeader1", "secretToken1")); jsonSource.HeaderParameters.Add(new HeaderParameter("MyAuthHeader2", "secretToken2")); jsonSource.QueryParameters.Add(new QueryParameter("id", "123456")); jsonSource.QueryParameters.Add(new QueryParameter("name", "MyName")); // ... }
Create a JsonDataSource object and assign the UriJsonSource object to it.
public static JsonDataSource CreateReportDataSourceWithAuthenticationInCode() { // ... // Create a JsonDataSource object and assign the UriJsonSource object to it var jsonDataSource = new DevExpress.DataAccess.Json.JsonDataSource() { JsonSource = jsonSource }; return jsonDataSource; // ... }
Assign the JsonDataSource object to your report.
private void CreateReportDataSourceWithAuthenticationInCodeButton_Click(object sender, EventArgs e) { // XtraReport1 does not have assigned data sources var report = new XtraReport1(); // Create JsonDataSource in code JsonDataSource jsonDataSource = CreateReportDataSourceWithAuthenticationInCode(); // Retrieve data to populate the Report Designer's Field List jsonDataSource.Fill(); report.DataSource = jsonDataSource; report.DataMember = "Customers"; new DevExpress.XtraReports.UI.ReportDesignTool(report).ShowDesigner(); }
Migrate from v18.2
The following table illustrates the different approaches you use to provide JSON authentication in v18.2 and v19.1+:
v18.2 | v19.1+ |
---|---|
Implement a custom UriJsonSource class to provide authentication parameters | The UriJsonSource class includes the AuthenticationInfo, HeaderParameters and QueryParameters properties. |
Implement a custom wizard page based on the Specify JSON Data Location page to provide authentication parameter editors. Register this page. | The Data Source Wizard includes two extra pages: Configure Web Service Endpoint Request and Save the Connection String. |
To migrate reports from v18.2 to v19.1+, call the method demonstrated in the code below. This method converts a specified report definition as if you use the Save Authentication Parameters to the Configuration File approach.
public static class JsonDatasourceAuthorization_Example {
public static string ConvertReportWithMyUriJsonSourceTo191(string repxContent, out List<string> connectionString) {
var report = new XtraReport();
using(var ms = new MemoryStream(Encoding.UTF8.GetBytes(repxContent))) {
report.LoadLayoutFromXml(ms);
}
connectionString = new List<string>();
int i = 0;
foreach(var component in report.ComponentStorage) {
var jsonDS = (component as DevExpress.DataAccess.Json.JsonDataSource);
var jsonSource = (jsonDS?.JsonSource as MyUriJsonSource);
if(jsonSource != null) {
i++;
jsonDS.ConnectionName = string.Format("newJsonConnection_{0}{1}", report.Name, i.ToString());
var builder = new DbConnectionStringBuilder();
builder.Add("Uri", jsonSource.Uri.OriginalString);
builder.Add("UserName", jsonSource.UserName);
builder.Add("Password", jsonSource.Password);
connectionString.Add(string.Format("<add name=\"{0}\" connectionString=\"{1}\" providerName=\"JsonSourceProvider\" />",
jsonDS.ConnectionName, builder.ConnectionString));
jsonDS.JsonSource = null;
}
}
using(var ms = new MemoryStream()) {
report.SaveLayoutToXml(ms);
ms.Position = 0;
StreamReader reader = new StreamReader(ms);
return reader.ReadToEnd();
}
}
}