MAUI Cleartext Traffic :在 <code>network_security_config.xml</code> 中添加以下配置可允许非加密HTTP流量:
时间: 2025-08-11 08:01:32 浏览: 0
<think>我们正在处理一个MAUI项目,需要配置允许特定域名的明文HTTP流量(cleartext traffic)。在Android原生开发中,我们通常通过`network_security_config.xml`文件来配置网络安全策略,然后在`AndroidManifest.xml`中引用。在MAUI项目中,由于它基于Xamarin的跨平台框架,我们同样需要配置Android特定的部分。
根据用户的问题,他们希望在MAUI项目中允许明文HTTP流量。在MAUI中,配置Android的网络安全策略的步骤与传统的Xamarin.Android类似,但需要注意MAUI项目结构。
步骤:
1. 在`Platforms/Android`目录下创建(或修改)`Resources/xml/network_security_config.xml`文件。
2. 编辑该文件,添加允许明文流量的域名配置。
3. 在`Platforms/Android`目录下的`AndroidManifest.xml`文件中引用这个配置文件。
具体操作如下:
### 1. 创建或修改网络安全配置文件
在MAUI项目的`Platforms/Android/Resources/xml`目录中,创建`network_security_config.xml`文件(如果不存在则创建)。然后在该文件中配置允许明文流量的域名。
例如,允许`example.com`及其子域名的明文流量:
```xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- 允许特定域名使用明文HTTP -->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">example.com</domain>
<!-- 可以添加多个域名 -->
</domain-config>
<!-- 默认情况下禁止明文流量 -->
<base-config cleartextTrafficPermitted="false" />
</network-security-config>
```
注意:这里我们设置了一个域名配置(domain-config)允许明文流量,同时设置了一个基础配置(base-config)禁止明文流量。这样,除了我们明确允许的域名,其他都禁止明文流量。
### 2. 在AndroidManifest.xml中引用配置文件
打开`Platforms/Android/AndroidManifest.xml`文件(通常在`Platforms/Android`目录下),在`<application>`标签中添加`android:networkSecurityConfig`属性,指向我们创建的配置文件:
```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
</manifest>
```
注意:如果`AndroidManifest.xml`中已经存在`<application>`标签,则只需添加`android:networkSecurityConfig`属性即可。
### 3. 关于IP地址的注意事项
如果允许的域名是IP地址(如开发测试时使用本地IP),则需要在`<domain>`标签中直接写IP地址,例如:
```xml
<domain includeSubdomains="true">192.168.1.100</domain>
```
但是注意,IP地址在`<domain>`标签中是允许的,但`includeSubdomains`对于IP地址没有实际意义,因为IP地址没有子域的概念。
### 4. 动态配置(可选)
根据引用[4],我们还可以通过Gradle配置为不同构建类型(debug/release)设置不同的网络安全配置文件。在MAUI项目中,我们通常不直接修改Gradle文件,但可以通过条件编译或文件替换来实现类似效果。不过,在MAUI中更常见的做法是使用条件编译指令或维护不同的配置文件,然后通过构建过程替换。
但是,在MAUI中,我们通常直接修改`AndroidManifest.xml`和`network_security_config.xml`文件,因为MAUI的项目结构已经简化。如果需要为Debug和Release设置不同的配置,可以:
- 在`Resources`目录下创建两个文件:`network_security_config_debug.xml`和`network_security_config_release.xml`。
- 然后通过修改`.csproj`文件,在构建时根据配置选择不同的文件。
不过,由于MAUI项目默认没有提供这样的钩子,一个简单的方法是使用条件编译指令在代码中修改,但这样较为复杂。另一种方法是,在Debug配置中允许所有明文流量(不推荐)或仅允许特定域名(如测试服务器),在Release中禁止。我们可以通过以下方式:
在`network_security_config.xml`中,我们也可以使用条件编译,但XML本身不支持条件编译。因此,我们可以在构建时替换文件。但考虑到复杂性,对于大多数情况,我们可以在Release配置中移除允许明文的配置,只保留Debug配置。但是,我们更推荐在Release中完全禁止明文流量。
如果确实需要,可以在`.csproj`文件中添加构建任务,根据配置替换文件。但这里不展开,因为大多数情况下,我们只需要在开发阶段允许特定域名(如本地测试IP),而在发布时移除这些配置。
### 5. 验证配置生效
配置完成后,在应用启动时会应用这些安全配置。我们可以通过以下方式验证:
- 尝试向配置允许明文流量的域名发起HTTP请求,应该能成功。
- 尝试向其他域名发起HTTP请求,应该失败(抛出`CLEARTEXT communication not permitted`异常)。
### 6. 注意事项
- **Android 9及以上版本**:默认禁止明文流量,因此必须进行此配置[^3]。
- **安全性**:允许明文流量会降低安全性,建议仅在开发测试阶段使用,生产环境应使用HTTPS。
如果遇到问题,请检查:
- 配置文件路径是否正确(`Platforms/Android/Resources/xml/network_security_config.xml`)。
- `AndroidManifest.xml`中是否引用了该配置文件(属性`android:networkSecurityConfig`)。
- 域名是否拼写正确(不支持通配符,如`*.example.com`,但可以通过`includeSubdomains="true"`来包含子域名)。
通过以上步骤,MAUI项目就可以允许特定域名的明文HTTP流量了。
相关问题:
1. 在MAUI中如何为不同构建配置(Debug/Release)设置不同的网络安全策略?
2. 在MAUI中配置网络安全后,如何解决`CLEARTEXT communication not permitted`错误?
3. MAUI项目中的AndroidManifest.xml文件位置在哪里?
4. 除了允许明文流量,还有哪些方法可以安全地连接本地开发服务器?
5. 在MAUI中如何配置自定义证书或信任用户证书?</think>### MAUI 项目中配置允许明文 HTTP 流量的方法
在 .NET MAUI 项目中配置允许明文 HTTP 流量,需要通过 Android 原生配置实现。以下是详细步骤:
#### 1. **添加网络安全配置文件**
在 `Platforms/Android/Resources/xml/` 目录下创建 `network_security_config.xml` 文件(若目录不存在请手动创建):
```xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- 允许特定域名/IP使用明文HTTP -->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">example.com</domain>
<domain includeSubdomains="true">192.168.1.100</domain> <!-- 本地测试IP -->
</domain-config>
<!-- 默认禁止所有明文流量 -->
<base-config cleartextTrafficPermitted="false" />
</network-security-config>
```
#### 2. **修改 AndroidManifest.xml**
在 `Platforms/Android/AndroidManifest.xml` 的 `<application>` 标签中添加引用:
```xml
<application
android:networkSecurityConfig="@xml/network_security_config"
... >
</application>
```
#### 3. **配置构建类型(可选)**
在 `Platforms/Android/AndroidManifest.xml` 中动态配置不同环境的策略:
```xml
<application
android:networkSecurityConfig="@xml/network_security_config_${buildConfig}"
... >
</application>
```
在 `.csproj` 文件中添加配置:
```xml
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
<AndroidManifestPlaceholders>buildConfig=debug</AndroidManifestPlaceholders>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Release'">
<AndroidManifestPlaceholders>buildConfig=release</AndroidManifestPlaceholders>
</PropertyGroup>
```
#### 4. **创建不同环境的配置文件**
- **Debug 配置** (`Resources/xml/network_security_config_debug.xml`):
```xml
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">192.168.1.100</domain>
</domain-config>
</network-security-config>
```
- **Release 配置** (`Resources/xml/network_security_config_release.xml`):
```xml
<network-security-config>
<base-config cleartextTrafficPermitted="false" />
</network-security-config>
```
#### 关键注意事项:
1. **Android 9+ 限制**:从 Android 9 (API 28) 开始,默认阻止所有明文流量[^3]
2. **IP 地址支持**:可直接在 `<domain>` 标签中使用 IP 地址[^3]
3. **子域名包含**:`includeSubdomains="true"` 包含所有子域名
4. **安全警告**:生产环境**必须使用 HTTPS**,明文配置仅限测试环境[^3]
5. **MAUI 特殊路径**:配置文件必须放在 `Platforms/Android/Resources/xml/` 目录下
#### 验证配置是否生效:
1. 发起 HTTP 请求到配置的域名/IP
2. 使用 Android Studio 的 Logcat 查看网络安全策略加载日志
3. 若出现 `CLEARTEXT communication not permitted` 错误,表示配置未生效[^3]
> **最佳实践**:通过 `#if DEBUG` 条件编译在代码层面对明文请求进行额外控制,避免生产环境意外使用 HTTP。
阅读全文
相关推荐




















