You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter应用集成ADFS身份认证的实现需求与指导请求

ADFS身份认证核心原理

ADFS(Active Directory Federation Services)是微软推出的身份联邦服务,核心作用是帮你的Flutter应用对接企业内部的Active Directory(AD),不用直接处理账号密码验证:

  • 应用向ADFS发起认证请求,ADFS负责跳转到企业AD的登录界面
  • 用户输入域账号密码后,AD验证身份有效性,再通知ADFS生成安全令牌(通常是JWT格式)
  • ADFS将令牌返回给应用,应用可凭此令牌访问受保护的后端服务,后端也能通过ADFS验证令牌的合法性
Flutter集成ADFS认证分步指南

1. 协调ADFS服务器配置(必须和企业AD管理员配合)

  • 让管理员为你的Flutter应用注册一个客户端身份,获取三个关键参数:
    • Client ID:应用的唯一标识符
    • Redirect URI:认证成功后跳转回应用的地址,格式推荐用msal{ClientID}://auth(比如ClientID是abc123,就填msalabc123://auth)
    • ADFS端点地址:包括授权端点(https://你的ADFS服务器地址/adfs/oauth2/authorize)、令牌端点(https://你的ADFS服务器地址/adfs/oauth2/token)
  • 确认管理员已在ADFS上启用OAuth2.0协议(ADFS 2016及以上版本默认支持)

2. 替换ADAL,选择合适的Flutter包

ADAL对新版ADFS和Flutter的兼容性有限,推荐使用更轻量的标准OAuth2包flutter_appauth,或微软官方适配的msal_flutter。以下以flutter_appauth为例:
在pubspec.yaml中添加依赖:

dependencies:
  flutter_appauth: ^6.0.0
  shared_preferences: ^2.2.2 # 用于本地存储令牌

3. 配置应用的URL Scheme

这一步是让ADFS认证成功后能跳转回你的Flutter应用:

Android端

修改android/app/src/main/AndroidManifest.xml,添加如下intent-filter:

<activity android:name="net.openid.appauth.RedirectUriReceiverActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="msal你的ClientID" /> <!-- 替换成你的Redirect URI的scheme部分 -->
    </intent-filter>
</activity>

iOS端

修改ios/Runner/Info.plist,添加URL Types配置:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>msal你的ClientID</string> <!-- 同样替换成你的scheme -->
        </array>
    </dict>
</array>

4. 实现认证核心逻辑

初始化客户端

import 'package:flutter_appauth/flutter_appauth.dart';
import 'package:shared_preferences/shared_preferences.dart';

final FlutterAppAuth _appAuth = FlutterAppAuth();
final String _clientId = '你的ClientID';
final String _redirectUri = 'msal你的ClientID://auth';
final String _issuer = 'https://你的ADFS服务器地址/adfs'; // ADFS服务器根地址

登录功能

Future<void> signIn() async {
  try {
    final AuthorizationTokenResponse? result = await _appAuth.authorizeAndExchangeCode(
      AuthorizationTokenRequest(
        _clientId,
        _redirectUri,
        issuer: _issuer,
        scopes: ['openid', 'profile', 'email'], // 根据需求申请权限
        promptValues: ['login'], // 强制每次登录显示账号密码界面
      ),
    );

    if (result != null) {
      // 将令牌保存到本地
      final prefs = await SharedPreferences.getInstance();
      await prefs.setString('access_token', result.accessToken!);
      await prefs.setString('id_token', result.idToken!);
      // 登录成功,跳转到主页面
    }
  } catch (e) {
    print('登录失败: $e');
    // 处理错误,比如提示用户
  }
}

登出功能

Future<void> signOut() async {
  final prefs = await SharedPreferences.getInstance();
  final idToken = prefs.getString('id_token');
  
  try {
    await _appAuth.endSession(
      EndSessionRequest(
        idTokenHint: idToken,
        postLogoutRedirectUri: _redirectUri,
        issuer: _issuer,
      ),
    );
    // 清除本地令牌
    await prefs.remove('access_token');
    await prefs.remove('id_token');
    // 跳转到登录页面
  } catch (e) {
    print('登出失败: $e');
  }
}

5. 后端令牌验证(可选)

如果你的应用有后端服务,后端可以通过ADFS的JWKS端点(https://你的ADFS服务器地址/adfs/discovery/keys)获取公钥,验证JWT令牌的签名、有效期和受众,无需直接对接AD。

内容的提问来源于stack exchange,提问作者saad khurshid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:10:31