Del via


Gennemgang: Server til server-godkendelse for flere lejere

 

Udgivet: januar 2017

Gælder for: Dynamics 365 (online)

I denne gennemgang beskrives fremgangsmåden for oprettelse af et webprogram til flere lejere, som kan oprette forbindelse til en December 2016 – opdatering til Microsoft Dynamics 365 (online)-lejer ved hjælp af Microsoft Visual Studio 2015 MVC-webprogramskabelonen.

Krav

  • Visual Studio 2015 med webudviklerværktøjer installeret

  • En December 2016 – opdatering til Microsoft Dynamics 365 (online)-lejer, der er knyttet til din Azure Active Directory (Azure AD)-lejer.

  • En anden December 2016 – opdatering til Microsoft Dynamics 365 (online)-lejer, der er knyttet til en anden Azure AD-lejer. Denne lejer repræsenterer en abonnent til dit program. Dette kan være en prøveversion af et December 2016 – opdatering til Microsoft Dynamics 365 (online)-abonnement.

Målet med denne gennemgang

Når du har fuldført denne gennemgang, har du et MVC-webprogram, som bruger WhoAmIRequest Class til at hente data om den bruger, som programmet bruger til at oprette forbindelse til Dynamics 365 (online)-lejeren.

Når du kører programmet korrekt, kan du se kommandoen Log på i øverste højre hjørne.

The sign in command in the app

Klik på kommandoen Log på, og bliv ført til Azure AD, hvor du kan angive dine legitimationsoplysninger.

Når du logger på, vises der en WhoAmI-kommando.

The WhoAmI command

Klik på WhoAmI, og du bør kunne se følgende:

Results of a WhoAmI request

Når du opretter en forespørgsel for din Dynamics 365-lejer, kan du se, at de returnerede resultater fra WhoAmI-meddelelsen refererer til en bestemt programbrugerkonto, som du har konfigureret til brug i webprogrammet, i stedet for den brugerkonto, du bruger i øjeblikket.

Kontrollere Azure AD-lejer

Før du begynder, kan du oprette forbindelse til din Office 365 Administrationhttps://portal.office.com, og kontrollere i rullelisten Administration, at du kan se både Dynamics 365 og Azure AD.

Admin Centers with Azure Active Directory and Dynamics 365

Hvis dit abonnement på Azure AD ikke er knyttet til et Dynamics 365-abonnement, kan du ikke give rettigheder til programmet for at få adgang til Dynamics 365-data.

Hvis du ikke kan se denne indstilling, kan du se Registrer dit gratis Azure Active Directory-abonnement for at få oplysninger om, hvordan du registrerer dig for at få dit Azure AD-abonnement.

Hvis du allerede har et Azure-abonnement, men det er ikke tilknyttet din Microsoft Office 365-konto, skal du se Knyt din Office 365-konto til Azure AD for at oprette og administrere apps.

Oprette et MVC-webprogram

Ved hjælp af Visual Studio 2015 kan du oprette et nyt MVC-webprogram og registrere det med din Azure AD-lejer.

  1. Åbn Visual Studio 2015.

  2. Sørg for, at det Microsoft-konto, du er logget på med, er det samme som, du bruger til at få adgang til den Azure AD-lejer, du vil bruge til at registrere dit program.

  3. Klik på Nyt projekt , og vælg .NET Framework 4.6.1 og skabelonen ASP.NET-webprogram.

    Klik på OK, og vælg MVC i dialogboksen for Nyt ASP.NET-projekt.

  4. Klik på knappen Skift godkendelse, og vælg Arbejds- og skolekonti i dialogboksen.

  5. Vælg Sky – flere organisationer på rullelisten.

    ASP.NET MVC Change Authentication Dialog

  6. Klik på OK, og fuldfør initialiseringen af projektet.

    Bemærk

    Oprettelse af et Visual Studio-projekt på denne måde registrerer programmet hos din Azure AD-lejer og tilføjer følgende nøgler til Web.Config appSettings:

    <add key="ida:ClientId" value="baee6b74-3c39-4c04-bfa5-4414f3dd1c26" />
    <add key="ida:AADInstance" value="https://login.microsoftonline.com/" />
    <add key="ida:ClientSecret" value="HyPjzuRCbIl/7VUJ2+vG/+Gia6t1+5y4dvtKAcyztL4=" /> 
    

Registrere dit program i Azure AD

Hvis du har fulgt trinnene i Oprette et MVC-webprogram, skal du kunne se, at webprogramprojektet, du har oprettet i Visual Studio, allerede er registreret i dit Azure AD-program. Men der er endnu et trin, du skal udføre fra Azure AD-portalen.

  1. Gå til https://portal.azure.com , og vælg Azure Active Directory.

  2. Klik på Appregistreringer , og find det program, du har oprettet ved hjælp af Visual Studio. I området Generelt skal du kontrollere egenskaberne:

    Application registration data in Azure Active Directory

  3. Kontroller, at egenskaben Program-id svarer til den ClientId-værdi, der er tilføjet i dine Web.Config appSettings.

  4. Værdien URL-adresse til startsiden skal svare til egenskaben SSL URL i dit Visual Studio-projekt og bør føre til en URL-adresse for localhost, dvs. https://localhost:44392 /.

    Bemærk

    Du skal ændre dette senere, når du faktisk udgiver programmet. Men du skal have indstillet dette til den korrekte localhost-værdi med henblik på fejlfinding.

  5. Du skal give dit program rettigheder til at få adgang til Dynamics 365-data. I området API-adgang skal du klikke på Krævede tilladelser. Du bør kunne se, at det allerede har rettigheder til Windows Azure Active Directory.

  6. Klik på Tilføj og derefter Vælg en API. Vælg Dynamics 365 på listen, og klik derefter på knappen Vælg.

  7. Under Vælg tilladelser skal du vælge Få adgang til Dynamics 365 som organisationsbrugere. Klik derefter på knappen Vælg.

  8. Klik på Udført for at tilføje disse tilladelser. Når du er færdig, skal du kunne se de anvendte tilladelser:

    Dynamics 365 permissions applied to application in Azure Active Directory

  9. I området API-adgang skal du bekræfte, at der er tilføjet en Key-værdi. Værdien Key er ikke synlig i Azure-portalen, når programmet er blevet oprettet, men denne værdi blev føjet til dine Web.Config appSettings som ClientSecret.

Oprette en programbruger

Ved hjælp af trinnene i Oprette en Dynamics 365-programbruger manuelt skal du oprette en programbruger med værdien Program-Id fra din programregistrering, som også er den samme som værdien ClientId i Web.Config.

Tilføje assemblyer

Tilføje følgende NuGet-pakker til dit projekt

Pakke

Version

Microsoft.CrmSdk.CoreAssemblies

Seneste version

Microsoft.IdentityModel.Clients.ActiveDirectory

2.22.302111727

Microsoft.IdentityModel.Tokens

5.0.0

Microsoft.Azure.ActiveDirectory.GraphClient

2.1.0

Bemærk

Opdater ikke Microsoft.IdentityModel.Clients.ActiveDirectory-assemblierne til den nyeste version. Version 3.x af disse assemblier har ændret en grænseflade, som Microsoft.CrmSdk.CoreAssemblies afhænger af.

Oplysninger om administration af NuGet-pakker finder du under NuGet-dokumentation: Administration af NuGet-pakker ved hjælp af brugergrænsefladen

Anvende kodeændringer til MVC-skabelonen

Følgende kodeændringer giver grundlæggende funktioner til brug af Dynamics 365WhoAmI-meddelelsen. Kontrollér, at programbrugerens konto-id bruges af programmet.

Web.config

Tilføj følgende nøgler til appSettings.

<add key="ida:OrganizationHostName" value="https://{0}.crm.dynamics.com" /> 

Strengen ida:OrganizationHostName har abonnentens organisationsnavn for Dynamics 365 online tilføjet på pladsholderen, så du skal have adgang til den rette tjeneste.

<add key="owin:appStartup" value="<your app namespace>.Startup" />

Strengen owin:appStartup sikrer, at OWIN-middlewaren bruger klassen Startup i dette projekt. Ellers får du følgende fejlmeddelelse:

- No assembly found containing an OwinStartupAttribute.
- No assembly found containing a Startup or [AssemblyName].Startup class.

Yderligere oplysninger: ASP.NET: Registrering af OWIN-opstartsklasse

Controllers/HomeController.cs

Tilføj AllowAnonymous-decorator til Index-handlingen. Dette giver adgang til standardsiden uden godkendelse.

using System.Web.Mvc;

namespace SampleApp.Controllers
{
    [Authorize]
    public class HomeController : Controller
    {
        [AllowAnonymous]
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }
}

Bemærk

I webprogrammet eller tjenesten forventes det ikke, at du tillader anonym adgang. Anonym adgang bruges her af hensyn til overskueligheden. Styring af adgangen til dit program er ikke omfattet af denne gennemgang.

Views/Shared/_Layout.cshtml

Hvis du vil vise kommandolinket WhoAmI for godkendte brugere, skal du redigere denne fil.

Find div-elementet med klassen navbar-collapse collapse, og rediger det ved at tilføje nedenstående kode:

<div class="navbar-collapse collapse">
    <ul class="nav navbar-nav">
     <li>@Html.ActionLink("Home", "Index", "Home")</li>
     <li>@Html.ActionLink("About", "About", "Home")</li>
     <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
     @if (Request.IsAuthenticated)
     {
         <li>@Html.ActionLink("WhoAmI", "Index", "CrmSdk")</li>
     }
    </ul>

    @Html.Partial("_LoginPartial")
   </div>

App_Start/Startup.Auth.cs

Følgende ændringer aktiverer samtykkestrukturen, når en ny lejer logger på programmet:

public partial class Startup
 {
  private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
  private string appKey = ConfigurationManager.AppSettings["ida:ClientSecret"];
  //Not used   
  //private string graphResourceID = "https://graph.windows.net";    
  private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
  private string authority = aadInstance + "common";
  private ApplicationDbContext db = new ApplicationDbContext();

  //Added
  private string OrganizationHostName = ConfigurationManager.AppSettings["ida:OrganizationHostName"];

  public void ConfigureAuth(IAppBuilder app)
  {

   app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

   app.UseCookieAuthentication(new CookieAuthenticationOptions { });

   app.UseOpenIdConnectAuthentication(
       new OpenIdConnectAuthenticationOptions
       {
        ClientId = clientId,
        Authority = authority,
        TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
        {
         /*
         instead of using the default validation 
         (validating against a single issuer value, as we do in line of business apps), 
         we inject our own multitenant validation logic
         */
         ValidateIssuer = false,
        },
        Notifications = new OpenIdConnectAuthenticationNotifications()
        {
         SecurityTokenValidated = (context) =>
                  {
                   return Task.FromResult(0);
                  },
         AuthorizationCodeReceived = (context) =>
                  {
                   var code = context.Code;

                   ClientCredential credential = new ClientCredential(clientId, appKey);
                   string tenantID = context
                    .AuthenticationTicket
                    .Identity
                    .FindFirst("https://schemas.microsoft.com/identity/claims/tenantid")
                    .Value;

                   /* Not used
                  string signedInUserID = context
                     .AuthenticationTicket
                     .Identity
                     .FindFirst(ClaimTypes.NameIdentifier)
                     .Value;  
                     */

                   //Added
                   var resource = string.Format(OrganizationHostName, '*');
                   //Added
                   Uri returnUri = new Uri(
                    HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)
                    );

                   /* Changed below
                    AuthenticationContext authContext = 
                    new AuthenticationContext(
                     aadInstance + tenantID, 
                     new ADALTokenCache(signedInUserID)
                     );
                    */
                   //Changed version
                   AuthenticationContext authContext =
                   new AuthenticationContext(aadInstance + tenantID);

                   /* Changed below
                   AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(
                       code, 
                       new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), 
                       credential, 
                       graphResourceID);
                   */
                   //Changed version
                   AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(
                       code,
                       new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)),
                       credential,
                       resource);

                   return Task.FromResult(0);
                  },
         AuthenticationFailed = (context) =>
                  {
                   context.OwinContext.Response.Redirect("/Home/Error");
                   context.HandleResponse(); // Suppress the exception
                   return Task.FromResult(0);
                  }
        }
       });

  }
 }

Tilføje Controllers/CrmSdkController

Tilføj følgende CrmSdkController.cs til mappen Controllers. Denne kode udfører WhoAmI-meddelelsen

  1. Højreklik på mappen Controllers, og vælg Tilføj > Controller...

  2. I dialogboksen Tilføj Scaffold skal du vælge MVC5 Controller – Tom

  3. Klik på Tilføj

  4. Indsæt følgende kode, som erstatter <Your app namespace> med navneområdet i din app.

using Microsoft.IdentityModel.Clients.ActiveDirectory; 
using Microsoft.Xrm.Sdk; 
using Microsoft.Xrm.Sdk.WebServiceClient; 
using System; using System.Configuration; 
using System.Linq; 
using System.Security.Claims; 
using System.Web.Mvc;

namespace <Your app namespace>
{
 [Authorize]
 public class CrmSdkController : Controller
    {

  private string clientId = 
   ConfigurationManager.AppSettings["ida:ClientId"];
  private string authority = 
   ConfigurationManager.AppSettings["ida:AADInstance"] + "common";
  private string aadInstance = 
   ConfigurationManager.AppSettings["ida:AADInstance"];
  private string OrganizationHostName = 
   ConfigurationManager.AppSettings["ida:OrganizationHostName"];
  private string appKey = 
   ConfigurationManager.AppSettings["ida:ClientSecret"];


  // GET: CrmSdk
  public ActionResult Index()
  {
   string tenantID = ClaimsPrincipal
    .Current
    .FindFirst("https://schemas.microsoft.com/identity/claims/tenantid")
    .Value;
   // Clean organization name from user logged
   string organizationName = User.Identity.Name.Substring(
    User.Identity.Name.IndexOf('@') + 1, 
    User.Identity.Name.IndexOf('.') - (User.Identity.Name.IndexOf('@') + 1)
    );
   //string crmResourceId = "https://[orgname].crm.microsoftonline.com";
   var resource = string.Format(OrganizationHostName, organizationName);
   // Request a token using application credentials
   ClientCredential clientcred = new ClientCredential(clientId, appKey);
   AuthenticationContext authenticationContext = 
    new AuthenticationContext(aadInstance + tenantID);
   AuthenticationResult authenticationResult = 
    authenticationContext.AcquireToken(resource, clientcred);
   var requestedToken = authenticationResult.AccessToken;
   // Invoke SDK using using the requested token
   using (var sdkService =
    new OrganizationWebProxyClient(
     GetServiceUrl(organizationName), false)
     )
   {
    sdkService.HeaderToken = requestedToken;
    OrganizationRequest request = new OrganizationRequest() {
     RequestName = "WhoAmI"
    };
    OrganizationResponse response = sdkService.Execute(request);
    return View((object)string.Join(",", response.Results.ToList()));
   }
  }

  private Uri GetServiceUrl(string organizationName)
  {
   var organizationUrl = new Uri(
    string.Format(OrganizationHostName, organizationName)
    );
   return new Uri(
    organizationUrl + 
    @"/xrmservices/2011/organization.svc/web?SdkClientVersion=8.2"
);
  }
 }
}

Views/CrmSdk

Tilføj en ny visning med navnet Index.

  1. Højreklik på mappen CrmSdk, og vælg Tilføj > Visning...

  2. I dialogboksen Tilføje visning skal du angive følgende værdier:

    MVC Add View Dialog

  3. Klik på Tilføj

  4. Erstat den genererede kode med følgende:

    @model string
    @{
     ViewBag.Title = "SDK Connect";
    }
    
    
    <h2>@ViewBag.Title.</h2>
    
    <p>Connected and executed sdk command WhoAmI.</p>
    
    <p>Value: @Model</p>
    

Foretage fejlfinding af appen

Når du trykker på F5 for at foretage fejlfinding af programmet, kan du få en fejlmeddelelse om, at det certifikat, der åbner localhost ved hjælp af SSL, er der ikke tillid til. Følgende er nogle links til at løse problemet med Visual Studioog IIS Express:

Bemærk

Til dette trin skal du blot bruge det Microsoft-konto, der er knyttet til din Azure AD-lejer og den Dynamics 365-lejer, som det er tilknyttet. Dette viser ikke reelt et scenarie med flere lejere. Det gør vi i næste trin. Dette trin har blot til formål at kontrollere, at koden fungerer, før vi øger kompleksiteten ved at teste den faktiske funktion med flere lejere.

Se fremgangsmåden, der er beskrevet i Målet med denne gennemgang for at teste programmet.

På dette tidspunkt kan du kontrollere, at programbrugerkontoen blev anvendt. En nem metode til at kontrollere dette er at bruge Dynamics 365 Web API'en. Skriv den følgende URL-adresse på en fane eller i et vindue, der er separat, så UserId-værdien fra programmet bliver erstattet.

[Organization URI]/api/data/v8.2/systemusers(<UserId value>)?$select=fullname

Svaret for JSON skal ligne det følgende. Bemærk, at værdien fullname vil være for den programbruger, du har oprettet i trinnet Oprette en programbruger, og ikke den Dynamics 365-bruger, du anvendte til at logge på programmet.

    {
        "@odata.context": "[Organization Uri]/api/data/v8.2/$metadata#systemusers(fullname)/$entity",
        "@odata.etag": "W/\"603849\"",
        "fullname": "S2S User",
        "systemuserid": "31914b34-be8d-e611-80d8-00155d892ddc",
        "ownerid": "31914b34-be8d-e611-80d8-00155d892ddc"
    }

Konfigurere testabonnent

Da du har kontrolleret, at programmet fungerer, er det tid til at teste forbindelsen til en anden Dynamics 365 (online)-lejer. Med en anden Dynamics 365 (online)-organisation skal du udføre følgende trin.

Give samtykke fra den abonnerende lejer

Hvis du vil give dit samtykke, skal du udføre følgende trin, mens du er logget på Azure AD-administratoren:

  1. Mens du foretager fejlfinding af dit program, skal du åbne et separat InPrivate- eller incognito-vindue.

  2. I adressefeltet i vinduet skal du skrive URL-adressen til din app, dvs. https://localhost:44392/

  3. Klik på knappen Log på, og du bliver bedt om at give dit samtykke.

    Azure Active Directory consent form

Når du har givet dit samtykke, vender du tilbage til appen, men du ikke kan bruge den endnu. Hvis du klikker på WhoAmI på dette tidspunkt, kan du forvente følgende undtagelse:

System.ServiceModel.Security.MessageSecurityException
HResult=-2146233087
  Message=The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'Bearer authorization_uri=https://login.windows.net/4baaeaaf-2771-4583-99eb-7c7e39aa1e74/oauth2/authorize, resource_id=https://<org name>.crm.dynamics.com/'.
InnerException.Message =The remote server returned an error: (401) Unauthorized.

Når du giver dit samtykke, føjes programmet fra din Azure AD-lejer til programmerne for abonnentens Active Directory-lejer.

Oprette en brugerdefineret sikkerhedsrolle for abonnentlejeren

Den programbruger, du skal oprette, skal være knyttet til en brugerdefineret sikkerhedsrolle, som definerer brugerens rettigheder. Til dette manuelle testtrin, skal du først oprette en brugerdefineret sikkerhedsrolle manuelt.Flere oplysninger:TechNet: Oprette eller redigere en sikkerhedsrolle

Bemærk

Programbrugeren kan ikke knyttes til en af standardsikkerhedsrollerne i Dynamics 365. Du skal oprette en brugerdefineret sikkerhedsrolle for at knytte den til programbrugeren.

Oprette den abonnerende programbruger

Med henblik på denne gennemgang skal vi oprette programbrugeren manuelt for at kontrollere forbindelsen fra en anden lejer. Når du installerer for faktiske abonnenter, vil du automatisere dette trin.Flere oplysninger:Forberede en metode til at installere programbrugeren

Du opretter programbrugeren manuelt ved hjælp af de værdier, som du også brugte til udviklingsorganisationen under Oprette en programbruger. Undtagelsen er, at du først skal have fuldført trinnene for at give samtykke. Når du gemmer brugeren, indstilles værdierne for URI for program-id og Objekt-id for Azure AD. Du vil ikke kunne gemme brugeren, hvis du ikke først har givet samtykke.

Endelig skal knytte programbrugeren til den brugerdefinerede sikkerhedsrolle, du tilføjede i forrige trin.

Teste abonnentens forbindelse

Gentag trinnene i Foretage fejlfinding af appen, men brug legitimationsoplysningerne for en bruger fra en anden Dynamics 365-lejer.

Se også

Bruge server til server-godkendelse for flere lejere
Bruge enkelt-lejer server til server-godkendelse
Opbygge webprogrammer ved hjælp af Server til server-godkendelse (S2S)
Opret forbindelse til Microsoft Dynamics 365

Microsoft Dynamics 365

© 2017 Microsoft. Alle rettigheder forbeholdes. Ophavsret