Skip to Content
Technical Articles

SAP Business One Service Layer – SSO with UI API

As of SAP Business One 9.2, version for SAP HANA, besides the normal login, Service Layer supports SSO with SAP Business One SDK UI API.

Important Note:
Domain user SSO with Service Layer:

  • supported only for On-Demand Environment.

B1 user SSO with Service Layer:

  • supported only for On-Premise Environment.

In order to use Service Layer SSO you just have to connect as usual to the UI API and use the UI API SBO_Application object to get the Service Layer B1SESSION and ROUTEID cookies.

 

Here you have a very simple sample getting Service Layer context from UI API:

string serviceLayerAddress = "https://hanaserver:50000/b1s/v1";
string sConnectionContext = SBO_Application.Company.GetServiceLayerConnectionContext(serviceLayerAddress);

 

And a method getting Service Layer context and using it to call Service Layer via HttpWebRequest class:

private int PlayServiceLayer()
{
  string serviceLayerAddress = "https://hanaserver:50000/b1s/v1";
  string sConnectionContext = null;
  //Step 1: Get a session cookie from service layer
  try {
      sConnectionContext = SBO_Application.Company.GetServiceLayerConnectionContext(serviceLayerAddress);
  }
  catch (System.Exception ex)
  {
    continue;
  }
    
  if (sConnectionContext == null)
  {
    SBO_Application.MessageBox("Get service layer connection context error", 1, "Err", "", "");
    return -1;
  }
  //Step 2: Send requests with session cookie
  try {
    var request = WebRequest.Create(serviceLayerAddress + "/Items?$top=1") as HttpWebRequest;
    request.AllowAutoRedirect = false;
    request.Timeout = 30 * 1000;
    request.ServicePoint.Expect100Continue = false;
    request.CookieContainer = new CookieContainer();
    ServicePointManager.ServerCertificateValidationCallback += BypassSslCallback;
    string[] cookieItems = sConnectionContext.Split(';');
    foreach (var cookieItem in cookieItems) {
      string[] parts = cookieItem.Split('=');
      if (parts.Length == 2) {
        request.CookieContainer.Add(request.RequestUri, new Cookie(parts[0].Trim(), parts[1].Trim()));
      }
    }
    HttpWebResponse response = request.GetResponse() as HttpWebResponse;
    if (response.StatusCode != HttpStatusCode.OK) {
      SBO_Application.MessageBox("Get item error", 1, "Err", "", "");
      return -1;
    }
    string responseContent = null;
    using (var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) {
      responseContent = reader.ReadToEnd();
    }
    SBO_Application.MessageBox(responseContent, 1, "Ok", "", "");
  }
  catch (System.Exception ex) {
    SBO_Application.MessageBox(ex.ToString(), 1, "Err", "", "");
  }
  return 0;
}

Hope it helps
Trinidad.

1 Comment
You must be Logged on to comment or reply to a post.