教程:为 Android 移动应用准备本机身份验证

适用于白色圆圈,带灰色 X 符号。 员工租户 绿色圆圈,带白色对勾符号。 外部租户(了解详细信息

本教程演示如何将Microsoft身份验证库 (MSAL) 本机身份验证 SDK 添加到 Android 移动应用。

在本教程中,你将:

  • 添加 MSAL 依赖项。
  • 创建配置文件。
  • 创建 MSAL SDK 实例。

先决条件

  • 如果尚未这样做,请按照 通过使用本机身份验证登录用户示例 Android(Kotlin)移动应用中的说明,注册外部租户中的应用。 请确保完成以下步骤:
    • 注册应用程序。
    • 启用公共客户端和本机身份验证流程。
    • 授予 API 权限。
    • 创建用户流。
    • 将应用与用户流相关联。
  • Android 项目。 如果没有 Android 项目,请创建它。

添加 MSAL 依赖项

  1. 在 Android Studio 中打开项目或创建新项目。

  2. 打开应用程序的 build.gradle 文件,然后添加以下依赖项:

    allprojects {
        repositories {
            //Needed for com.microsoft.device.display:display-mask library
            maven {
                url 'https://pkgs.dev.azure.com/MicrosoftDeviceSDK/DuoSDK-Public/_packaging/Duo-SDK-Feed/maven/v1'
                name 'Duo-SDK-Feed'
            }
            mavenCentral()
            google()
        }
    }
    //...
    
    dependencies { 
        implementation 'com.microsoft.identity.client:msal:6.+'
        //...
    }
    
  3. 在 Android Studio 中,选择“ 文件>同步项目与 Gradle 文件”。

创建配置文件

通过 JSON 配置设置将所需的租户标识符(例如应用程序(客户端)ID 传递到 MSAL SDK。

使用以下步骤创建配置文件:

  1. 在 Android Studio 的项目窗格中,导航到 app\src\main\res

  2. 右键单击 res 并选择“ 新建>目录”。 输入 raw 作为新目录名称,然后选择“确定”。

  3. app\src\main\res\raw 中,创建名为 auth_config_native_auth.json 的新 JSON 文件。

  4. auth_config_native_auth.json 文件中,添加以下 MSAL 配置:

    { 
      "client_id": "Enter_the_Application_Id_Here", 
      "authorities": [ 
        { 
          "type": "CIAM", 
          "authority_url": "https://Enter_the_Tenant_Subdomain_Here.ciamlogin.com/Enter_the_Tenant_Subdomain_Here.onmicrosoft.com/" 
        } 
      ], 
      "challenge_types": ["oob"], 
      "logging": { 
        "pii_enabled": false, 
        "log_level": "INFO", 
        "logcat_enabled": true 
      } 
    } 
     //...
    
  5. 将以下占位符替换为从 Microsoft Entra 管理中心获取的租户值:

    • Enter_the_Application_Id_Here 占位符替换为之前注册的应用的应用程序(客户端)ID。
    • Enter_the_Tenant_Subdomain_Here 替换为目录(租户)子域名。 例如,如果租户主域名是 contoso.onmicrosoft.com,请使用 contoso。 如果没有租户名称,请了解如何 阅读租户详细信息

    质询类型是值列表,应用使用它来通知 Microsoft Entra 有关它支持的身份验证方法。

    • 若要使用电子邮件一次性密码注册和登录流,请使用 ["oob"]
    • 若要使用电子邮件和密码注册和登录流,请使用 ["oob","password"]
    • 对于自助密码重置(SSPR),请使用 ["oob"]

    了解更多 挑战类型

可选:日志记录配置

创建日志回调以便在应用创建时启用日志记录,这样 SDK 就可以输出日志。

import com.microsoft.identity.client.Logger

fun initialize(context: Context) {
        Logger.getInstance().setExternalLogger { tag, logLevel, message, containsPII ->
            Logs.append("$tag $logLevel $message")
        }
    }

若要配置记录器,需要在配置文件中添加一个部分: auth_config_native_auth.json

    //...
   { 
     "logging": { 
       "pii_enabled": false, 
       "log_level": "INFO", 
       "logcat_enabled": true 
     } 
   } 
    //...
  1. logcat_enabled:启用库的日志记录功能。
  2. pii_enabled:指定是记录包含个人数据的消息还是记录组织数据。 设置为 false 时,日志将不包含个人数据。 设置为 true 时,日志可能包含个人数据。
  3. log_level:使用它来确定要启用的日志记录级别。 Android 支持以下日志级别:
    1. 错误
    2. 警告
    3. 信息
    4. 详细

有关 MSAL 日志记录的详细信息,请参阅 MSAL for Android 中的日志记录

创建本机身份验证 MSAL SDK 实例

onCreate() 方法中,创建 MSAL 实例,以便应用可以通过本机身份验证对租户执行身份验证。 该方法返回名为 authClientcreateNativeAuthPublicClientApplication() 的实例。 传递前面创建的 JSON 配置文件作为参数。

    //...
    authClient = PublicClientApplication.createNativeAuthPublicClientApplication( 
        this, 
        R.raw.auth_config_native_auth 
    )
    //...

代码应类似于以下代码片段:

    class MainActivity : AppCompatActivity() { 
        private lateinit var authClient: INativeAuthPublicClientApplication 
 
        override fun onCreate(savedInstanceState: Bundle?) { 
            super.onCreate(savedInstanceState) 
            setContentView(R.layout.activity_main) 
 
            authClient = PublicClientApplication.createNativeAuthPublicClientApplication( 
                this, 
                R.raw.auth_config_native_auth 
            ) 
            getAccountState() 
        } 
 
        private fun getAccountState() {
            CoroutineScope(Dispatchers.Main).launch {
                val accountResult = authClient.getCurrentAccount()
                when (accountResult) {
                    is GetAccountResult.AccountFound -> {
                        displaySignedInState(accountResult.resultValue)
                    }
                    is GetAccountResult.NoAccountFound -> {
                        displaySignedOutState()
                    }
                }
            }
        } 
 
        private fun displaySignedInState(accountResult: AccountState) { 
            val accountName = accountResult.getAccount().username 
            val textView: TextView = findViewById(R.id.accountText) 
            textView.text = "Cached account found: $accountName" 
        } 
 
        private fun displaySignedOutState() { 
            val textView: TextView = findViewById(R.id.accountText) 
            textView.text = "No cached account found" 
        } 
    } 
  • 使用 getCurrentAccount()来检索缓存帐户,该操作会返回一个对象 accountResult
  • 如果在持久性中找到帐户,请使用 GetAccountResult.AccountFound 来显示已登录状态。
  • 否则,使用 GetAccountResult.NoAccountFound 显示已注销状态。

确保包含 import 语句。 Android Studio 应该会自动为你添加 import 语句。

后续步骤