|
| 1 | +--- |
| 2 | +title: "Use of Office365 authentication with the WS-Trust security protocol (Common Data Service) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces |
| 3 | +description: "Describes deprecation of the WS-Trust security protocol and the authentication code changes required in applications." |
| 4 | +ms.custom: "" |
| 5 | +ms.date: 02/05/2020 |
| 6 | +ms.reviewer: "" |
| 7 | +ms.service: powerapps |
| 8 | +ms.topic: "article" |
| 9 | +author: "phecke" # GitHub ID |
| 10 | +ms.author: "pehecke" # MSFT alias of Microsoft employees only |
| 11 | +manager: "kvivek" # MSFT alias of manager or PM counterpart |
| 12 | +search.audienceType: |
| 13 | + - developer |
| 14 | +search.app: |
| 15 | + - PowerApps |
| 16 | + - D365CE |
| 17 | +--- |
| 18 | + |
| 19 | +# Use of Office365 authentication with the WS-Trust security protocol |
| 20 | + |
| 21 | +Use of the WS-Trust authentication security protocol when connecting to Common |
| 22 | +Data Service is no longer recommended and has been |
| 23 | +deprecated; see the [announcement](/power-platform/important-changes-coming#deprecation-of-office365-authentication-type-and-organizationserviceproxy-class-for-connecting-to-common-data-service). |
| 24 | + |
| 25 | +This change |
| 26 | +impacts custom client applications that use “Office365” authentication and the |
| 27 | +[Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy](/dotnet/api/microsoft.xrm.sdk.client.organizationserviceproxy) |
| 28 | +or |
| 29 | +[Microsoft.Xrm.Tooling.Connector.CrmServiceClient](/dotnet/api/microsoft.xrm.tooling.connector.crmserviceclient) |
| 30 | +classes. If your applications use this type of authentication protocol and API, |
| 31 | +continue reading below to learn more about the recommended authentication |
| 32 | +changes to be made to your application’s code. |
| 33 | + |
| 34 | +## How do I know if my code or application is using WS-Trust? |
| 35 | + |
| 36 | +First and most importantly, this change **only** impacts client applications that |
| 37 | +connect to the Common Data Service. It does not impact custom plug-ins, |
| 38 | +workflow activities, or on-premises/IFD service connections. |
| 39 | + |
| 40 | +- If your code employs user account and password credentials for authentication with Common Data Service or an application, you are likely using the WS-Trust security protocol. Some examples are shown below, though this list is not fully inclusive. |
| 41 | + |
| 42 | + - When using the [CrmServiceClient](/dotnet/api/microsoft.xrm.tooling.connector.crmserviceclient) class with a connection string: |
| 43 | + |
| 44 | + `connectionString="AuthType=Office365; Username=jsmith\@contoso.onmicrosoft.com;Password=passcode;Url=https://contoso.crm.dynamics.com"` |
| 45 | + |
| 46 | + - When using [OrganizationServiceProxy](/dotnet/api/microsoft.xrm.sdk.client.organizationserviceproxy) class constructors: |
| 47 | + |
| 48 | + |
| 49 | +```csharp |
| 50 | +using (OrganizationServiceProxy organizationServiceProxy = |
| 51 | + new OrganizationServiceProxy(serviceManagement, clientCredentials) |
| 52 | +{ ... } |
| 53 | +``` |
| 54 | + |
| 55 | +- If you are using the `OrganizationServiceProxy` class at all in your code, you are using WS-Trust. |
| 56 | + |
| 57 | +- If you are using [CrmServiceClient](/dotnet/api/microsoft.xrm.tooling.connector.crmserviceclient).`OrganizationServiceProxy` in your code, you are using WS-Trust. |
| 58 | + |
| 59 | +## What should I do to fix my application code if affected? |
| 60 | + |
| 61 | +There are very straight forward ways to modify your application’s code to use |
| 62 | +the recommended connection interface for authentication with Common Data |
| 63 | +Service. |
| 64 | + |
| 65 | +- If your code uses an [Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy](/dotnet/api/microsoft.xrm.sdk.client.organizationserviceproxy) instance: |
| 66 | + |
| 67 | + If you are passing the `OrganizationServiceProxy` instance around to various methods, or returning the instance from a function, replace all occurrences of the type `OrganizationServiceProxy` with the [IOrganizationService](/dotnet/api/microsoft.xrm.sdk.iorganizationservice?view=dynamics-general-ce-9) interface. This interface exposes all the core methods used to communicate with Common Data Service. |
| 68 | + |
| 69 | + When invoking the constructor, it is recommend you add the NuGet package [Microsoft.CrmSdk.XrmTooling.CoreAssembly](https://www.nuget.org/packages/Microsoft.CrmSdk.XrmTooling.CoreAssembly/) to your project and replace all use of `OrganizationServiceProxy` class constructors with [CrmServiceClient](/dotnet/api/microsoft.xrm.tooling.connector.crmserviceclient) class constructors. You will need to alter your coding pattern here, however, for simplicity `CrmServiceClient` supports connection strings in addition to complex constructors and the ability to provide external authentication handlers. `CrmServiceClient` implements `IOrganizationService`, therefore your new authentication code will be portable to the rest of your application code. You can find examples on the use of `CrmServiceClient` in the [PowerApps-Samples](https://github.com/microsoft/PowerApps-Samples/tree/master/cds/orgsvc/C%23) repository. |
| 70 | +
|
| 71 | +- If your code is using [CrmServiceClient](/dotnet/api/microsoft.xrm.tooling.connector.crmserviceclient) with the “Office365” authentication |
| 72 | + type: |
| 73 | + |
| 74 | + An example of this is a connections string that looks like this: |
| 75 | + |
| 76 | + `connectionString = "AuthType=Office365;Username=jsmith@contoso.onmicrosoft.com;Password=passcode;Url=https://contoso.crm.dynamics.com"` |
| 77 | +
|
| 78 | + Similarly, you could also use a `CrmServiceClient` constructor and pass in `AuthType.Office365`. |
| 79 | + |
| 80 | + You have two options for dealing with this.<p/> |
| 81 | + |
| 82 | + - Switch over to using an OAuth based connection string. Such connection string looks like this: |
| 83 | + |
| 84 | + `connectionString = "AuthType=OAuth;Username=jsmith@contoso.onmicrosoft.com; |
| 85 | + Password=passcode;Url=https://contosotest.crm.dynamics.com;AppId=51f81489-12ee-4a9e-aaae-a2591f45987d; |
| 86 | + RedirectUri=app://58145B91-0C36-4500-8554-080854F2AC97;LoginPrompt=Auto"` |
| 87 | +
|
| 88 | + This will be your fastest way to update the code. Note that LoginPrompt can be set to “never” to simulate the way that the Office 365 behavior worked. |
| 89 | + |
| 90 | + The AppId and RedirectUri provided above are examples of working application registration values. These values work everywhere our online services are deployed. However, they are provided here as examples and you are encouraged to create your own application registration in Azure Active Directory (AAD) for applications running in your tenant.<p/> |
| 91 | + |
| 92 | + - When we announce it, update to the latest [Microsoft.CrmSdk.XrmTooling.CoreAssembly](https://www.nuget.org/packages/Microsoft.CrmSdk.XrmTooling.CoreAssembly/) NuGet package that includes auto redirect support. This library will redirect an authentication type of Office365 to OAuth and use the example AppId and Redirect URI automatically. This capability is planned for the 9.2.x version of the Microsoft.CrmSdk.XrmTooling.CoreAssembly package. |
| 93 | +
|
| 94 | +- If you are accessing the [CrmServiceClient](/dotnet/api/microsoft.xrm.tooling.connector.crmserviceclient).`OrganizationServiceProxy` property: |
| 95 | + |
| 96 | + Remove all use of that property in your code. `CrmServiceClient` implements `IOrganizationService` and exposes everything that is settable for the organization service proxy. |
| 97 | + |
| 98 | +> [!IMPORTANT] |
| 99 | +> Regarding not being able to login using User ID/Password even if using OAuth: if your tenant and user is configured in Azure Active Directory for conditional access and/or Multi-Factor Authentication is required, you will not be able to use user ID/password flows in a non-interactive form at all. For those situations, you must use a Service Principal user to authenticate with Common Data Service.<p/> |
| 100 | +To do this, you must first register the application user (Service Principal) in Azure Active Directory. You can find out how to do this [here](https://docs.microsoft.com/azure/active-directory/develop/howto-create-service-principal-portal). During application registration you will need to create that user in Common Data Service and grant permissions. Those permissions can either be granted directly or indirectly by adding the application user to a team which has been granted permissions in Common Data Service. You can find more information on how to set up an application user to authenticate with Common Data Service [here](/powerapps/developer/common-data-service/use-single-tenant-server-server-authentication). |
| 101 | +
|
| 102 | +## Need help? |
| 103 | + |
| 104 | +We will be monitoring the Power Apps ALM and ProDev community [forums](https://powerusers.microsoft.com/t5/Power-Apps-Component-Framework/bd-p/pa_component_framework). Please take a look there to get help on how to solve various issues or post a |
| 105 | +question. |
0 commit comments