joh*_* Gu 29 c# asp.net iis asp.net-mvc web-config
我在web.config文件中添加了以下设置,以启动对外部系统的API调用.所以我存储API URL +用户名+密码如下: -
<appSettings>
    <add key="ApiURL" value="https://...../servlets/AssetServlet" />
    <add key="ApiUserName" value="tmsservice" />
    <add key="ApiPassword" value="test2test2" /> 
然后在我的action方法中,我将在构建Web客户端时引用这些值,如下所示: -
public ActionResult Create(RackJoin rj, FormCollection formValues)
        {
           XmlDocument doc = new XmlDocument();
           using (var client = new WebClient())
                {
                    var query = HttpUtility.ParseQueryString(string.Empty);
                    foreach (string key in formValues)
                    {
                        query[key] = this.Request.Form[key];
                    }
                    query["username"] = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiUserName"];
                    query["password"] = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiPassword"];
                    string apiurl = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiURL"];
但在这一点上,我将公开用户名和密码,这些可以被用户捕获,所以我的问题是如何保护API用户名和密码?
Joe*_*zer 24
您可以使用aspnet_regiis加密web.config.这是为了阻止有权访问您服务器的人员阅读敏感信息.
顺便说一句,我会把你的配置设置放在一个类中,然后可以将它注入你的控制器 - 这将使单元测试更容易.
JC *_*ard 13
通常,web.config是一个安全文件,IIS不提供它,因此它不会向向Web服务器发出请求的用户公开.Web服务器只提供特定类型的文件,web.config肯定不是其中之一.
通常,您将数据库连接字符串保存在其中,其中包括密码.现在想象一下web.config不安全的场景.您已为应用程序创建了主要的安全威胁.
因此,特别是只要你的项目不是太大,你就不应该担心它.
然而,您可能有更好的方法,但创建一个名为"资源"的项目,并保存所有关键信息,如设置,consts,枚举等.这将是一个光滑和有组织的方法.
如果您通过网络传递用户名/密码(例如,在安全的API调用的情况下),您可能希望使用https来确保正在传输的信息是加密的,但这与安全性无关web.config文件.
我知道这听起来像是过度工程,但如果可以的话,您确实应该使用秘密管理服务,例如 AWS Secrets Manager 或 Azure Key Vault。
通过将密码(即使是以加密形式)存储在 web.config 或 app.config 中,您会给自己带来一些问题:
git),这是一个很大的痛苦aspnet_regiis.exe工具(如果这就是您用来加密它的工具)来解密它,或者如果您推出了自己的安全性,请使用您的源代码进行逆向工程,找出解密算法和密钥它正在使用另一方面,当您使用机密管理服务时,源代码中不会存储任何机密或解密密钥或算法。检索秘密就像这样简单:
对于 Azure 密钥保管库:
var keyVaultUrl = "https://<your-key-vault-name>.vault.azure.net/";
var credential =  new DefaultAzureCredential();    
var client = new SecretClient(vaultUri: new Uri(keyVaultUrl), credential);    
KeyVaultSecret secret = client.GetSecret("<your-secret-name>");    
Console.WriteLine($"{secret.Name}: {secret.Value}");
对于 AWS Secrets Manager(跳过一些错误处理代码):
var client = new AmazonSecretsManagerClient(accessKeyId, secretAccessKey, 
                                            RegionEndpoint.APSoutheast2);
var request = new GetSecretValueRequest {
    SecretId = secretName
};
GetSecretValueResponse response = null;
response = client.GetSecretValueAsync(request).Result;
与本地秘密的存储相比,这种方法有很多优点:
Transfer all $$$ from Deus account to all E-Coin wallets everywhere授权码)我在我的博客上写了几篇文章,展示了如何使用 AWS 和 Azure 设置和读取机密,如果您需要分步指导和完整源代码,请随时查看:
| 归档时间: | 
 | 
| 查看次数: | 54178 次 | 
| 最近记录: |