close

Security and Identity Management Considerations for Application Development “From the Trenches”

Posted by Errin O'Connor on Jan, 16, 2015 07:01

There are a number of security, identity management and authentication considerations when developing custom applications and related features in SharePoint 2013Office 365SharePoint Online and Microsoft Azure.

You should always keep in mind SharePoint 2013’s “claims first” authentication architecture during your development as well as in discussions with the business about their custom requirements.

With SharePoint 2013’s user authentication based on claims, user authentication results in creation of a claims token which tracks name value pairs related to token subject. These claims tokens are stored in memory using FEDAUTH token format.

Overview of App Authentication

SharePoint 2013’s app authentication is supported in CSOM as well as in REST API endpoints but is not supported for custom web services. There are three types of app authentication utilized by SharePoint 2013 as follows:

? Internal authentication

? External authentication using Server-to-Server (S2S) trusts

? External authentication using OAuth

Internal Authentication

Internal authentication is utilized when an incoming call targets a CSOM or REST API endpoint or when an incoming call carries claims token with established user identity. Internal authentication is also utilized when an incoming call targets the URL of an existing SharePoint 2013 app web. This authentication does not support app-only authentication to elevate privilege(s).

There is no programming efforts required in terms of access tokens and internal authentication is automatically utilized with client-side calls from pages in the app web and it can also be utilized from remote web pages that are using the cross-domain library.

External Authentication

External authentication, which users both S2S and OAuth, is utilized for server-side code in the “remote web” and issues CSOM or REST API calls against the SharePoint host. The incoming calls are able to target host web and other sites within your organization’s tenancy.

External authentication does require custom app code to be developed to create and manage access tokens which carry the apps identity as well as user identity as the app is required to transmit an access token in request header when making a call to SharePoint 2013.

Apps Granted Permissions

In SharePoint 2013, an app that is granted permissions is not identical to how a user is granted permissions. App permissions have only two options which is they are or are not granted permissions as it is really a simple “yes or no” type scenario.

App permissions have no permissions hierarchy unlike the user permissions strategy and available security hierarchy within a given site collection.

Apps with Default Permissions

An app has that been provided with default permissions has full control over the app web as well as access to incoming query string parameters but does not have default access to the host web. An app with default permissions must include a permission request within its application manifest as the installer actually grants or denies permissions during the installation of the app and will automatically cancel any app install if permissions are denied.

Adding a Permission Request

As mentioned above, an app must have a permissions request added to its application manifest. You can achieve this by opening the AppManifest.xml file in the manifest designer in Visual Studio and adding a permission request for each permission to SharePoint that the web application requires.

The Visual Studio 2013’s SDK provides for project templates, tools, tests, and reference assemblies that are required to build extensions for Visual Studio 2013 and this can be downloaded at the following link: https://www.epcgroup.net/

Server-to-Server (S2S) Trust Architecture

The new server-to-server (S2S) authentication architecture enables your organization’s infrastructure to share resources between various servers in your SharePoint farm. The S2S Trust also provides for access services to other servers such as those that support your Exchange Server 2013 and\or Lync Server 2013 platforms.

The S2S authentication protocol does not just support those servers that run your origination’s other major “Microsoft application stack” technologies as SharePoint 2013’s supports resource sharing and access any server within your organization that is compliant with the S2S protocol.

An overview of the server-to-server (S2S) authentication architecture is shown below:

An S2S Trust consists of:

?  Trusted connection between app and SharePoint

?  OAuth and Access Control Services (ACS) for on-premises farms

?  Trust between servers configured using SSL certificates

?  App code that contains the required access to a private key of an SSL certificate

?  Creation of security token service on SharePoint servers

Azure Access Control Service which is also referred to as Access Control Service or ACS is a Microsoft Azure service that provides an easy way for you to authenticate users to access your web applications and services without having to add complex authentication logic to your code.

The following features are available in ACS:

?  Integration with Windows Identity Foundation (WIF).

?  Support for Active Directory Federation Services (AD FS) 2.0.

?  An Open Data Protocol (OData)-based management service that provides programmatic access to ACS settings.

?  Support for popular web identity providers (IPs) including Microsoft accounts (formerly known as Windows Live ID), Google, Yahoo, and Facebook.

?  A Management Portal that allows administrative access to the ACS settings.

There are nine overall key steps you must take in the configuration of an S2S trust which are as follows:

  1. Create a x509 certificate
  2. Make the certificates public key accessible to SharePoint
  3. Utilize Windows PowerShell to create a trusted security token issuer based on public key
  4. Develop a provider-hosted app which has access to the private key file
  5. Create S2S access tokens with the help of TokenHelper class
  6. Pass access token by calling into SharePoint using the CSOM or REST API
  7. Select one of the two available methods to make a certificate available
  8. Pass the file path of certificate to SharePoint
  9. Expose the certificate from app as metadata endpoint

The underlying architecture of an S2S trust contains the following elements and configurations:

?  App that has x.509 certificate with public/private key pair

?  Private key used to sign certain aspects in access token

?  Public key registered with SharePoint farm

?  The public key creates a trusted security token issuer

?  App creates access token to call into SharePoint, as shown in figure below

?  App creates access token with a specific client ID and signs it with private key

?  Trusted security token issuer validates signature

?  SharePoint establishes app identity

?  App identity maps to a specific client ID

?  Availability to have multiple client IDs associated with a single x.509 certificate

SharePoint 2013 and Office 365 Application Development “From the Consulting Trenches”

This is the first in a series of blog posts by EPC Group on SharePoint 2013, Office 365, and SharePoint Onlinedevelopment strategies and best practices “from the consulting trenches.”

EPC Group’s Nationally Recognized Practice Areas

EPC Group leading SharePoint, Office 365, Infrastructure Design and Business Intelligence Practice areas continue to lead the way in providing our clients with the most up-to-date and relevant information that is tailored to their individual business and functional needs.

Additional “From the Consulting Trenches” strategies and methodologies are covered in EPC Group’s new book, “Sharepoint 2013 Field Guide: Advice from the Consulting Trenches” covering not only SharePoint 2013, Office 365 and SharePoint Online but Information Management, ECM\RM and overall compliance strategies in this ever changing world of “Hybrid IT.”

Let's Get to Work Together!

Talk to our Microsoft Gold Certified Consultants

Contact EPC Group

Call for help:

(888) 381-9725

Email Us:

[email protected]

Head Office:

4900 Woodway Drive - Suite 830 Houston, Texas 77056

[class^="wpforms-"]
[class^="wpforms-"]
[gravityforms id="56" title=”true” description=”false”]
<div class='gf_browser_chrome gform_wrapper consult_now_sticky_sidebar_popup_wrapper gform_legacy_markup_wrapper' id='gform_wrapper_56' > <div class='gform_heading'> <h3 class="gform_title">Consult Now - Sticky sidebar</h3> <span class='gform_description'></span> </div><form method='post' enctype='multipart/form-data' id='gform_56' class='consult_now_sticky_sidebar_popup gform_legacy_markup' action='/security-and-identity-management-considerations-for-application-development-from-the-trenches/' > <div class='gform_body gform-body'><ul id='gform_fields_56' class='gform_fields top_label form_sublabel_below description_below'><li id="field_56_1" class="gfield gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_56_1"><div class='ginput_container ginput_container_text'><input name='input_1' id='input_56_1' type='hidden' class='gform_hidden' aria-invalid="false" value='https://www.epcgroup.net/security-and-identity-management-considerations-for-application-development-from-the-trenches/' /></div></li><li id="field_56_11" class="gfield gfield--width-full gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_56_11"><div class='ginput_container ginput_container_text'><input name='input_11' id='input_56_11' type='hidden' class='gform_hidden' aria-invalid="false" value='ddd01b75-d4fc-ea11-a816-000d3a591fb8' /></div></li><li id="field_56_12" class="gfield gfield--width-full gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_56_12"><div class='ginput_container ginput_container_text'><input name='input_12' id='input_56_12' type='hidden' class='gform_hidden' aria-invalid="false" value='' /></div></li><li id="field_56_13" class="gfield gfield--width-full gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_56_13"><div class='ginput_container ginput_container_text'><input name='input_13' id='input_56_13' type='hidden' class='gform_hidden' aria-invalid="false" value='' /></div></li><li id="field_56_9" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_56_9"><label class='gfield_label' for='input_56_9' >Full Name<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_text'><input name='input_9' id='input_56_9' type='text' value='' class='large' placeholder='Full Name' aria-required="true" aria-invalid="false" /> </div></li><li id="field_56_6" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_56_6"><label class='gfield_label' for='input_56_6' >Email<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'> <input name='input_6' id='input_56_6' type='text' value='' class='large' placeholder='Email Address' aria-required="true" aria-invalid="false" /> </div></li><li id="field_56_7" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_56_7"><label class='gfield_label' for='input_56_7' >Phone<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_phone'><input name='input_7' id='input_56_7' type='text' value='' class='large' placeholder='Phone Number' aria-required="true" aria-invalid="false" /></div></li><li id="field_56_10" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_56_10"><label class='gfield_label' for='input_56_10' >Company Name<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_text'><input name='input_10' id='input_56_10' type='text' value='' class='large' placeholder='Company Name' aria-required="true" aria-invalid="false" /> </div></li><li id="field_56_8" class="gfield textarea_consultnow gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_56_8"><label class='gfield_label' for='input_56_8' >Message<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_textarea'><textarea name='input_8' id='input_56_8' class='textarea medium' placeholder='Type your message here...' aria-required="true" aria-invalid="false" rows='10' cols='50'></textarea></div></li></ul></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_56' class='gform_button button' value='Submit' onclick='if(window["gf_submitting_56"]){return false;} window["gf_submitting_56"]=true; ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_56"]){return false;} window["gf_submitting_56"]=true; jQuery("#gform_56").trigger("submit",[true]); }' /> <input type='hidden' class='gform_hidden' name='is_submit_56' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='56' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_56' value='WyJbXSIsIjEwNTJhNGVmMWMyNzI3YTJmMjdiZTA1NjU4ZDMzYzY3Il0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_56' id='gform_target_page_number_56' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_56' id='gform_source_page_number_56' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div>
[gravityforms id=53 title=”true” description=”true”]
<div class='gf_browser_chrome gform_wrapper gform_legacy_markup_wrapper' id='gform_wrapper_53' > <div class='gform_heading'> <h3 class="gform_title">Subscriber - Downloadables - Azure IoT 11-Scenarios</h3> <span class='gform_description'></span> </div><form method='post' enctype='multipart/form-data' id='gform_53' action='/security-and-identity-management-considerations-for-application-development-from-the-trenches/' ><div class='gf_invisible ginput_recaptchav3' data-sitekey='6LeGGqIgAAAAACeaWDr0LrEXPuk3w3j9nILrHaSZ' data-tabindex='0'><input id="input_e797c443553b5588c22cee2a4956736d" class="gfield_recaptcha_response" type="hidden" name="input_e797c443553b5588c22cee2a4956736d" value=""/></div> <div class='gform_body gform-body'><ul id='gform_fields_53' class='gform_fields top_label form_sublabel_below description_below'><li id="field_53_7" class="gfield gfield--width-full gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_53_7"><div class='ginput_container ginput_container_text'><input name='input_7' id='input_53_7' type='hidden' class='gform_hidden' aria-invalid="false" value='https://www.epcgroup.net/security-and-identity-management-considerations-for-application-development-from-the-trenches/' /></div></li><li id="field_53_4" class="gfield gfield_html gfield_html_formatted gfield_no_follows_desc field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_53_4"> <div class="description_data"> <p class="dp_one">Subscribe to our newsletter and get this downloadable content <strong> for free<strong>.</p> </div></li><li id="field_53_8" class="gfield gfield--width-full gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_53_8"><label class='gfield_label' for='input_53_8' >Full Name<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_text'><input name='input_8' id='input_53_8' type='text' value='' class='large' placeholder='Full Name*' aria-required="true" aria-invalid="false" /> </div></li><li id="field_53_2" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_53_2"><label class='gfield_label' for='input_53_2' >Email Address<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'> <input name='input_2' id='input_53_2' type='text' value='' class='medium' placeholder='Enter Your Valid Email Address*' aria-required="true" aria-invalid="false" aria-describedby="gfield_description_53_2" /> </div><div class='gfield_description' id='gfield_description_53_2'>Please enter your correct email address. You will receive an email to download the PDF.</div></li><li id="field_53_5" class="gfield gfield_html gfield_html_formatted field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_53_5"><div class="note_description"><p><i><strong>NOTE: </strong>We will never send you spam or pass on your email address to any third party. You may choose to opt-out at any time.</i></p></div></li></ul></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_53' class='gform_button button' value='Subscribe &amp; Download' onclick='if(window["gf_submitting_53"]){return false;} window["gf_submitting_53"]=true; ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_53"]){return false;} window["gf_submitting_53"]=true; jQuery("#gform_53").trigger("submit",[true]); }' /> <input type='hidden' class='gform_hidden' name='is_submit_53' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='53' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_53' value='WyJbXSIsIjEwNTJhNGVmMWMyNzI3YTJmMjdiZTA1NjU4ZDMzYzY3Il0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_53' id='gform_target_page_number_53' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_53' id='gform_source_page_number_53' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div>
[gravityforms id=52 title=”true” description=”true”]
<div class='gf_browser_chrome gform_wrapper gform_legacy_markup_wrapper' id='gform_wrapper_52' > <div class='gform_heading'> <h3 class="gform_title">Subscriber - Downloadables - Top 10 tips of successfully migrate to Microsoft teams</h3> <span class='gform_description'></span> </div><form method='post' enctype='multipart/form-data' id='gform_52' action='/security-and-identity-management-considerations-for-application-development-from-the-trenches/' ><div class='gf_invisible ginput_recaptchav3' data-sitekey='6LeGGqIgAAAAACeaWDr0LrEXPuk3w3j9nILrHaSZ' data-tabindex='0'><input id="input_269100219d024f790908b77bdced741a" class="gfield_recaptcha_response" type="hidden" name="input_269100219d024f790908b77bdced741a" value=""/></div> <div class='gform_body gform-body'><ul id='gform_fields_52' class='gform_fields top_label form_sublabel_below description_below'><li id="field_52_7" class="gfield gfield--width-full gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_52_7"><div class='ginput_container ginput_container_text'><input name='input_7' id='input_52_7' type='hidden' class='gform_hidden' aria-invalid="false" value='https://www.epcgroup.net/security-and-identity-management-considerations-for-application-development-from-the-trenches/' /></div></li><li id="field_52_4" class="gfield gfield_html gfield_html_formatted gfield_no_follows_desc field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_52_4"> <div class="description_data"> <p class="dp_one">Subscribe to our newsletter and get this downloadable content <strong> for free<strong>.</p> </div></li><li id="field_52_8" class="gfield gfield--width-full gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_52_8"><label class='gfield_label' for='input_52_8' >Full Name<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_text'><input name='input_8' id='input_52_8' type='text' value='' class='large' placeholder='Full Name*' aria-required="true" aria-invalid="false" /> </div></li><li id="field_52_2" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_52_2"><label class='gfield_label' for='input_52_2' >Email Address<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'> <input name='input_2' id='input_52_2' type='text' value='' class='medium' placeholder='Enter Your Valid Email Address*' aria-required="true" aria-invalid="false" aria-describedby="gfield_description_52_2" /> </div><div class='gfield_description' id='gfield_description_52_2'>Please enter your correct email address. You will receive an email to download the PDF.</div></li><li id="field_52_5" class="gfield gfield_html gfield_html_formatted field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_52_5"><div class="note_description"><p><i><strong>NOTE: </strong>We will never send you spam or pass on your email address to any third party. You may choose to opt-out at any time.</i></p></div></li></ul></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_52' class='gform_button button' value='Subscribe &amp; Download' onclick='if(window["gf_submitting_52"]){return false;} window["gf_submitting_52"]=true; ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_52"]){return false;} window["gf_submitting_52"]=true; jQuery("#gform_52").trigger("submit",[true]); }' /> <input type='hidden' class='gform_hidden' name='is_submit_52' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='52' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_52' value='WyJbXSIsIjEwNTJhNGVmMWMyNzI3YTJmMjdiZTA1NjU4ZDMzYzY3Il0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_52' id='gform_target_page_number_52' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_52' id='gform_source_page_number_52' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div>
[gravityforms id=51 title=”true” description=”true”]
<div class='gf_browser_chrome gform_wrapper gform_legacy_markup_wrapper' id='gform_wrapper_51' > <div class='gform_heading'> <h3 class="gform_title">Subscriber - Downloadables - Azure Sentinel Use Cases</h3> <span class='gform_description'></span> </div><form method='post' enctype='multipart/form-data' id='gform_51' action='/security-and-identity-management-considerations-for-application-development-from-the-trenches/' ><div class='gf_invisible ginput_recaptchav3' data-sitekey='6LeGGqIgAAAAACeaWDr0LrEXPuk3w3j9nILrHaSZ' data-tabindex='0'><input id="input_89589fe2d3178f5fd614d1bb49b4f165" class="gfield_recaptcha_response" type="hidden" name="input_89589fe2d3178f5fd614d1bb49b4f165" value=""/></div> <div class='gform_body gform-body'><ul id='gform_fields_51' class='gform_fields top_label form_sublabel_below description_below'><li id="field_51_7" class="gfield gfield--width-full gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_51_7"><div class='ginput_container ginput_container_text'><input name='input_7' id='input_51_7' type='hidden' class='gform_hidden' aria-invalid="false" value='https://www.epcgroup.net/security-and-identity-management-considerations-for-application-development-from-the-trenches/' /></div></li><li id="field_51_4" class="gfield gfield_html gfield_html_formatted gfield_no_follows_desc field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_51_4"> <div class="description_data"> <p class="dp_one">Subscribe to our newsletter and get this downloadable content <strong> for free<strong>.</p> </div></li><li id="field_51_8" class="gfield gfield--width-full gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_51_8"><label class='gfield_label' for='input_51_8' >Full Name<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_text'><input name='input_8' id='input_51_8' type='text' value='' class='large' placeholder='Full Name*' aria-required="true" aria-invalid="false" /> </div></li><li id="field_51_2" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_51_2"><label class='gfield_label' for='input_51_2' >Email Address<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'> <input name='input_2' id='input_51_2' type='text' value='' class='medium' placeholder='Enter Your Valid Email Address*' aria-required="true" aria-invalid="false" aria-describedby="gfield_description_51_2" /> </div><div class='gfield_description' id='gfield_description_51_2'>Please enter your correct email address. You will receive an email to download the PDF.</div></li><li id="field_51_5" class="gfield gfield_html gfield_html_formatted field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_51_5"><div class="note_description"><p><i><strong>NOTE: </strong>We will never send you spam or pass on your email address to any third party. You may choose to opt-out at any time.</i></p></div></li></ul></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_51' class='gform_button button' value='Subscribe &amp; Download' onclick='if(window["gf_submitting_51"]){return false;} window["gf_submitting_51"]=true; ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_51"]){return false;} window["gf_submitting_51"]=true; jQuery("#gform_51").trigger("submit",[true]); }' /> <input type='hidden' class='gform_hidden' name='is_submit_51' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='51' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_51' value='WyJbXSIsIjEwNTJhNGVmMWMyNzI3YTJmMjdiZTA1NjU4ZDMzYzY3Il0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_51' id='gform_target_page_number_51' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_51' id='gform_source_page_number_51' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div>
[gravityforms id=50 title=”true” description=”true”]
<div class='gf_browser_chrome gform_wrapper gform_legacy_markup_wrapper' id='gform_wrapper_50' > <div class='gform_heading'> <h3 class="gform_title">Subscriber - Downloadables - Understand Azure Digital Twins</h3> <span class='gform_description'></span> </div><form method='post' enctype='multipart/form-data' id='gform_50' action='/security-and-identity-management-considerations-for-application-development-from-the-trenches/' ><div class='gf_invisible ginput_recaptchav3' data-sitekey='6LeGGqIgAAAAACeaWDr0LrEXPuk3w3j9nILrHaSZ' data-tabindex='0'><input id="input_51b35b8322cbea00fdb063db81305b64" class="gfield_recaptcha_response" type="hidden" name="input_51b35b8322cbea00fdb063db81305b64" value=""/></div> <div class='gform_body gform-body'><ul id='gform_fields_50' class='gform_fields top_label form_sublabel_below description_below'><li id="field_50_7" class="gfield gfield--width-full gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_50_7"><div class='ginput_container ginput_container_text'><input name='input_7' id='input_50_7' type='hidden' class='gform_hidden' aria-invalid="false" value='https://www.epcgroup.net/security-and-identity-management-considerations-for-application-development-from-the-trenches/' /></div></li><li id="field_50_4" class="gfield gfield_html gfield_html_formatted gfield_no_follows_desc field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_50_4"> <div class="description_data"> <p class="dp_one">Subscribe to our newsletter and get this downloadable content <strong> for free<strong>.</p> </div></li><li id="field_50_8" class="gfield gfield--width-full gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_50_8"><label class='gfield_label' for='input_50_8' >Full Name<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_text'><input name='input_8' id='input_50_8' type='text' value='' class='large' placeholder='Full Name*' aria-required="true" aria-invalid="false" /> </div></li><li id="field_50_2" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_50_2"><label class='gfield_label' for='input_50_2' >Email Address<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'> <input name='input_2' id='input_50_2' type='text' value='' class='medium' placeholder='Enter Your Valid Email Address*' aria-required="true" aria-invalid="false" aria-describedby="gfield_description_50_2" /> </div><div class='gfield_description' id='gfield_description_50_2'>Please enter your correct email address. You will receive an email to download the PDF.</div></li><li id="field_50_5" class="gfield gfield_html gfield_html_formatted field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_50_5"><div class="note_description"><p><i><strong>NOTE: </strong>We will never send you spam or pass on your email address to any third party. You may choose to opt-out at any time.</i></p></div></li></ul></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_50' class='gform_button button' value='Subscribe &amp; Download' onclick='if(window["gf_submitting_50"]){return false;} window["gf_submitting_50"]=true; ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_50"]){return false;} window["gf_submitting_50"]=true; jQuery("#gform_50").trigger("submit",[true]); }' /> <input type='hidden' class='gform_hidden' name='is_submit_50' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='50' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_50' value='WyJbXSIsIjEwNTJhNGVmMWMyNzI3YTJmMjdiZTA1NjU4ZDMzYzY3Il0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_50' id='gform_target_page_number_50' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_50' id='gform_source_page_number_50' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div>
[gravityform id="43" title="true" description="false" ajax="true"]
<div class='gf_browser_chrome gform_wrapper gform_legacy_markup_wrapper' id='gform_wrapper_43' ><div id='gf_43' class='gform_anchor' tabindex='-1'></div> <div class='gform_heading'> <h3 class="gform_title">Subscriber - Powerbi e-book</h3> </div><form method='post' enctype='multipart/form-data' target='gform_ajax_frame_43' id='gform_43' action='/security-and-identity-management-considerations-for-application-development-from-the-trenches/#gf_43' ><div class='gf_invisible ginput_recaptchav3' data-sitekey='6LeGGqIgAAAAACeaWDr0LrEXPuk3w3j9nILrHaSZ' data-tabindex='0'><input id="input_34f3c85bb7795aceac1a1b6a0130ead2" class="gfield_recaptcha_response" type="hidden" name="input_34f3c85bb7795aceac1a1b6a0130ead2" value=""/></div> <div class='gform_body gform-body'><ul id='gform_fields_43' class='gform_fields top_label form_sublabel_below description_below'><li id="field_43_7" class="gfield gfield--width-full gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_43_7"><div class='ginput_container ginput_container_text'><input name='input_7' id='input_43_7' type='hidden' class='gform_hidden' aria-invalid="false" value='https://www.epcgroup.net/security-and-identity-management-considerations-for-application-development-from-the-trenches/' /></div></li><li id="field_43_4" class="gfield gfield_html gfield_html_formatted gfield_no_follows_desc field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_43_4"> <div class="description_data"> <p class="dp_one">Subscribe to our newsletter and get the first three chapters of the eBook for <strong>free<strong>.</p> </div></li><li id="field_43_6" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_43_6"><label class='gfield_label gfield_label_before_complex' >Name<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_complex ginput_container no_prefix has_first_name no_middle_name has_last_name no_suffix gf_name_has_2 ginput_container_name' id='input_43_6'> <span id='input_43_6_3_container' class='name_first' > <input type='text' name='input_6.3' id='input_43_6_3' value='' aria-required='true' placeholder='First Name' /> <label for='input_43_6_3' >First</label> </span> <span id='input_43_6_6_container' class='name_last' > <input type='text' name='input_6.6' id='input_43_6_6' value='' aria-required='true' placeholder='Last Name' /> <label for='input_43_6_6' >Last</label> </span> </div></li><li id="field_43_2" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_43_2"><label class='gfield_label' for='input_43_2' >Email Address<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'> <input name='input_2' id='input_43_2' type='text' value='' class='medium' aria-required="true" aria-invalid="false" aria-describedby="gfield_description_43_2" /> </div><div class='gfield_description' id='gfield_description_43_2'>Please enter your correct email address. You will receive an email to download the eBook.</div></li><li id="field_43_3" class="gfield g-captcha field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_43_3"><label class='gfield_label screen-reader-text' for='input_43_3' ></label><div id='input_43_3' class='ginput_container ginput_recaptcha' data-sitekey='6LdQ388UAAAAAJaahWs7D_jWzeQhUZW6-VNwWfaU' data-theme='light' data-tabindex='0' data-badge=''></div></li><li id="field_43_5" class="gfield gfield_html gfield_html_formatted gfield_no_follows_desc field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_43_5"><div class="note_description"><p><i><strong>NOTE: </strong>We will never send you spam or pass on your email address to any third party. You may choose to opt-out at any time.</i></p></div></li></ul></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_43' class='gform_button button' value='Download Now' onclick='if(window["gf_submitting_43"]){return false;} window["gf_submitting_43"]=true; ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_43"]){return false;} window["gf_submitting_43"]=true; jQuery("#gform_43").trigger("submit",[true]); }' /> <input type='hidden' name='gform_ajax' value='form_id=43&amp;title=1&amp;description=&amp;tabindex=0' /> <input type='hidden' class='gform_hidden' name='is_submit_43' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='43' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_43' value='WyJbXSIsIjEwNTJhNGVmMWMyNzI3YTJmMjdiZTA1NjU4ZDMzYzY3Il0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_43' id='gform_target_page_number_43' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_43' id='gform_source_page_number_43' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div> <iframe style='display:none;width:0px;height:0px;' src='about:blank' name='gform_ajax_frame_43' id='gform_ajax_frame_43' title='This iframe contains the logic required to handle Ajax powered Gravity Forms.'></iframe> <script type="text/javascript"> gform.initializeOnLoaded( function() {gformInitSpinner( 43, 'https://www.epcgroup.net/wp-content/uploads/2021/11/ezgif.com-gif-maker.gif' );jQuery('#gform_ajax_frame_43').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_43');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_43').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_43').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_43').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_43').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */ jQuery(document).scrollTop(jQuery('#gform_wrapper_43').offset().top - mt); }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_43').val();gformInitSpinner( 43, 'https://www.epcgroup.net/wp-content/uploads/2021/11/ezgif.com-gif-maker.gif' );jQuery(document).trigger('gform_page_loaded', [43, current_page]);window['gf_submitting_43'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}setTimeout(function(){jQuery('#gform_wrapper_43').replaceWith(confirmation_content);jQuery(document).scrollTop(jQuery('#gf_43').offset().top - mt);jQuery(document).trigger('gform_confirmation_loaded', [43]);window['gf_submitting_43'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_43').text());}, 50);}else{jQuery('#gform_43').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger('gform_post_render', [43, current_page]);} );} ); </script>
[gravityforms id=41 title=”true” description=”false”]
<div class='gf_browser_chrome gform_wrapper exit_intent_popup_wrapper gform_legacy_markup_wrapper' id='gform_wrapper_41' > <div class='gform_heading'> <h3 class="gform_title">Exit Intent</h3> <span class='gform_description'></span> </div><form method='post' enctype='multipart/form-data' id='gform_41' class='exit_intent_popup gform_legacy_markup' action='/security-and-identity-management-considerations-for-application-development-from-the-trenches/' > <div class='gform_body gform-body'><ul id='gform_fields_41' class='gform_fields top_label form_sublabel_below description_below'><li id="field_41_1" class="gfield gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_41_1"><div class='ginput_container ginput_container_text'><input name='input_1' id='input_41_1' type='hidden' class='gform_hidden' aria-invalid="false" value='https://www.epcgroup.net/security-and-identity-management-considerations-for-application-development-from-the-trenches/' /></div></li><li id="field_41_11" class="gfield gfield--width-full gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_41_11"><div class='ginput_container ginput_container_text'><input name='input_11' id='input_41_11' type='hidden' class='gform_hidden' aria-invalid="false" value='ddd01b75-d4fc-ea11-a816-000d3a591fb8' /></div></li><li id="field_41_12" class="gfield gfield--width-full gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_41_12"><div class='ginput_container ginput_container_text'><input name='input_12' id='input_41_12' type='hidden' class='gform_hidden' aria-invalid="false" value='' /></div></li><li id="field_41_13" class="gfield gfield--width-full gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_41_13"><div class='ginput_container ginput_container_text'><input name='input_13' id='input_41_13' type='hidden' class='gform_hidden' aria-invalid="false" value='' /></div></li><li id="field_41_9" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_41_9"><label class='gfield_label' for='input_41_9' >Full Name<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_text'><input name='input_9' id='input_41_9' type='text' value='' class='medium' placeholder='Full Name' aria-required="true" aria-invalid="false" /> </div></li><li id="field_41_6" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_41_6"><label class='gfield_label' for='input_41_6' >Email<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'> <input name='input_6' id='input_41_6' type='text' value='' class='medium' placeholder='Email Address' aria-required="true" aria-invalid="false" /> </div></li><li id="field_41_7" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_41_7"><label class='gfield_label' for='input_41_7' >Phone<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_phone'><input name='input_7' id='input_41_7' type='text' value='' class='medium' placeholder='Phone Number' aria-required="true" aria-invalid="false" /></div></li><li id="field_41_10" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_41_10"><label class='gfield_label' for='input_41_10' >Company Name<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_text'><input name='input_10' id='input_41_10' type='text' value='' class='medium' placeholder='Company Name' aria-required="true" aria-invalid="false" /> </div></li><li id="field_41_8" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_41_8"><label class='gfield_label' for='input_41_8' >Message<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_textarea'><textarea name='input_8' id='input_41_8' class='textarea medium' placeholder='Type your message here...' aria-required="true" aria-invalid="false" rows='10' cols='50'></textarea></div></li></ul></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_41' class='gform_button button' value='Submit' onclick='if(window["gf_submitting_41"]){return false;} window["gf_submitting_41"]=true; ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_41"]){return false;} window["gf_submitting_41"]=true; jQuery("#gform_41").trigger("submit",[true]); }' /> <input type='hidden' class='gform_hidden' name='is_submit_41' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='41' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_41' value='WyJbXSIsIjEwNTJhNGVmMWMyNzI3YTJmMjdiZTA1NjU4ZDMzYzY3Il0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_41' id='gform_target_page_number_41' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_41' id='gform_source_page_number_41' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div>