Aracılığıyla paylaş


Web API'lerini çağıran masaüstü uygulaması: Tümleşik Windows kimlik doğrulamasını kullanarak belirteç alma

Etki alanına veya Microsoft Entra'ya katılmış makinede etki alanı kullanıcısında oturum açmak için tümleşik Windows kimlik doğrulamasını (IWA) kullanın.

Sınırlamalar

  • Tümleşik Windows kimlik doğrulaması yalnızca federe+ kullanıcılar, yani Active Directory'de oluşturulan ve Microsoft Entra Id ile yedeklenen kullanıcılar için kullanılabilir. Yönetilen kullanıcılar olarak bilinen Active Directory desteği olmadan doğrudan Microsoft Entra ID'de oluşturulan kullanıcılar bu kimlik doğrulama akışını kullanamaz. Bu sınırlama kullanıcı adı ve parola akışını etkilemez.

  • IWA, çok faktörlü kimlik doğrulamasını (MFA) atlamaz. MFA yapılandırıldıysa, MFA kullanıcı etkileşimi gerektirdiği için bir MFA sınaması gerekiyorsa IWA başarısız olabilir.

    IWA etkileşimli değildir, ancak MFA kullanıcı etkileşimi gerektirir. Kimlik sağlayıcısının MFA'nın gerçekleştirilmek için ne zaman istekte bulunacağı sizin denetiminiz değildir; kiracı yöneticisi bunu yapar. Gözlemlerimizden, farklı bir ülkeden/bölgeden oturum açtığınızda, VPN aracılığıyla bir kurumsal ağa bağlanmadığınızda ve bazen VPN üzerinden bağlandığınızda bile MFA gereklidir. Belirleyici bir kural kümesi beklemeyin. Microsoft Entra ID, MFA'nın gerekli olup olmadığını sürekli olarak öğrenmek için yapay zekayı kullanır. IWA başarısız olursa etkileşimli kimlik doğrulaması veya cihaz kodu akışı gibi bir kullanıcı istemine geri dönün.

  • Geçirilen PublicClientApplicationBuilder yetkilinin şu şekilde olması gerekir:

    • kiracı kimliği veya kiracıyla ilişkilendirilmiş bir etki alanını temsil eden GUID olan tenant formunun https://login.microsoftonline.com/{tenant}/kiracısı.
    • Tüm iş ve okul hesapları için: https://login.microsoftonline.com/organizations/.
    • Microsoft kişisel hesapları desteklenmez. /common veya /consumers kiracılarını kullanamazsınız.
  • Tümleşik Windows kimlik doğrulaması sessiz bir akış olduğundan:

    • Uygulamanızın kullanıcısı daha önce uygulamayı kullanmayı onaylamış olmalıdır.
    • Alternatif olarak, kiracı yöneticisinin daha önce kiracıdaki tüm kullanıcıların uygulamayı kullanmasına izin vermiş olması gerekir.
    • Başka bir deyişle:
      • Geliştirici olarak Azure portalındaki Ver düğmesini kendiniz seçtiniz.
      • Veya bir kiracı yöneticisi, uygulama kaydının API izinleri sekmesindeki {tenant domain} için yönetici onayı ver/iptal et düğmesini seçti. Daha fazla bilgi için bkz . Web API'nize erişmek için izin ekleme.
      • Veya kullanıcıların uygulamaya onay vermeleri için bir yol sağladınız. Daha fazla bilgi için bkz . Bireysel kullanıcı onayı isteme.
      • Alternatif olarak, kiracı yöneticisinin uygulamayı onaylaması için bir yol da sağladınız. Daha fazla bilgi için bkz. onay Yönetici.
  • Bu akış .NET masaüstü, .NET ve UWP uygulamaları için etkinleştirilir.

Onay hakkında daha fazla bilgi için bkz. Microsoft kimlik platformu izinleri ve onayı.

Nasıl kullanacağınızı öğrenin

MSAL.NET'da şunları kullanın:

AcquireTokenByIntegratedWindowsAuth(IEnumerable<string> scopes)

Normalde yalnızca bir parametreye () ihtiyacınız vardırscopes. Windows yöneticinizin ilkeleri ayarlama şekline bağlı olarak, Windows makinenizdeki uygulamaların oturum açmış kullanıcıyı aramasına izin verilmiyor olabilir. Bu durumda, ikinci bir yöntemi .WithUsername()kullanın ve oturum açmış kullanıcının kullanıcı adını UPN biçimi olarak (örneğin, joe@contoso.com) geçirin.

Aşağıdaki örnek, alabileceğiniz özel durum türlerinin ve bunların risk azaltmalarının açıklamaları ile birlikte en güncel durumu sunar.

static async Task GetATokenForGraph()
{
 string authority = "https://login.microsoftonline.com/contoso.com";
 string[] scopes = new string[] { "user.read" };
 IPublicClientApplication app = PublicClientApplicationBuilder
      .Create(clientId)
      .WithAuthority(authority)
      .Build();

 var accounts = await app.GetAccountsAsync();

 AuthenticationResult result = null;
 if (accounts.Any())
 {
  result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
      .ExecuteAsync();
 }
 else
 {
  try
  {
   result = await app.AcquireTokenByIntegratedWindowsAuth(scopes)
      .ExecuteAsync(CancellationToken.None);
  }
  catch (MsalUiRequiredException ex)
  {
   // MsalUiRequiredException: AADSTS65001: The user or administrator has not consented to use the application
   // with ID '{appId}' named '{appName}'.Send an interactive authorization request for this user and resource.

   // you need to get user consent first. This can be done, if you are not using .NET (which does not have any Web UI)
   // by doing (once only) an AcquireToken interactive.

   // If you are using .NET or don't want to do an AcquireTokenInteractive, you might want to suggest the user to navigate
   // to a URL to consent: https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id={clientId}&response_type=code&scope=user.read

   // AADSTS50079: The user is required to use multi-factor authentication.
   // There is no mitigation - if MFA is configured for your tenant and AAD decides to enforce it,
   // you need to fallback to an interactive flows such as AcquireTokenInteractive or AcquireTokenByDeviceCode
   }
   catch (MsalServiceException ex)
   {
    // Kind of errors you could have (in ex.Message)

    // MsalServiceException: AADSTS90010: The grant type is not supported over the /common or /consumers endpoints. Please use the /organizations or tenant-specific endpoint.
    // you used common.
    // Mitigation: as explained in the message from Azure AD, the authority needs to be tenanted or otherwise organizations

    // MsalServiceException: AADSTS70002: The request body must contain the following parameter: 'client_secret or client_assertion'.
    // Explanation: this can happen if your application was not registered as a public client application in Azure AD
    // Mitigation: in the Azure portal, edit the manifest for your application and set the `allowPublicClient` to `true`
   }
   catch (MsalClientException ex)
   {
      // Error Code: unknown_user Message: Could not identify logged in user
      // Explanation: the library was unable to query the current Windows logged-in user or this user is not AD or AAD
      // joined (work-place joined users are not supported).

      // Mitigation 1: on UWP, check that the application has the following capabilities: Enterprise Authentication,
      // Private Networks (Client and Server), User Account Information

      // Mitigation 2: Implement your own logic to fetch the username (e.g. john@contoso.com) and use the
      // AcquireTokenByIntegratedWindowsAuth form that takes in the username

      // Error Code: integrated_windows_auth_not_supported_managed_user
      // Explanation: This method relies on a protocol exposed by Active Directory (AD). If a user was created in Azure
      // Active Directory without AD backing ("managed" user), this method will fail. Users created in AD and backed by
      // AAD ("federated" users) can benefit from this non-interactive method of authentication.
      // Mitigation: Use interactive authentication
   }
 }

 Console.WriteLine(result.Account.Username);
}

AcquireTokenByIntegratedWindowsAuthentication'da olası değiştiricilerin listesi için bkz . AcquireTokenByIntegratedWindowsAuthParameterBuilder.

Sonraki adımlar

Bu senaryoda masaüstü uygulamasından web API'sini çağırma adlı sonraki makaleye geçin.