CredentialManagement 在生产中返回空字符串,但在开发中不返回
CredentialManagement returning empty strings in production but not development
我在项目中使用 Windows 凭据管理器时遇到问题。我用它来替换我的应用程序设置中 connectionString 上的用户名和密码,在开发和 QA 环境中一切正常,但在生产环境中(我没有完全访问权限)它没有。问题是当我从目标加载凭据时 returning 空字符串。
这是我加载它的地方:
public static CredentialModel GetCredential(string target)
{
CredentialModel credentialDto = new CredentialModel();
using var credential = new Credential
{
Target = target
};
credential.Load();
credentialDto.UserName = credential.Username;
credentialDto.Password = credential.Password;
return credentialDto;
}
这是 CredentialModel
public class CredentialModel
{
public string UserName { get; set; }
public string Password { get; set; }
}
以及我在 connectionString 中替换凭据的位置:
StringBuilder connectionString = new(host.Configuration.GetConnectionString("RemessasConnectionString"));
var credential = CredentialService.GetCredential("Pegasus");
connectionString.Replace("$userId", credential.UserName);
connectionString.Replace("$password", credential.Password);
ConnectionString = connectionString.ToString();
为了调试,我在日志中添加了一行以查看添加到 connectionString 中的内容,并且在生产中用空字符串替换它,但在开发中使用实际值。
我对此有一个想法,应用程序是 运行 一个 windows 用户,该用户无权访问生产服务器中的 windows 凭据管理器(但我认为这会 return 一个错误,而不仅仅是空字符串)。
如果有人能指出我正确的方向,或者有任何建议让我尝试,我会洗耳恭听。
正如@richard-deeming 指出的那样,这是因为用户 运行 应用程序无权访问存储的凭据,因为它们存储在与 [=13= 不同的帐户下] 服务。查看他的评论了解更多详情。
我在项目中使用 Windows 凭据管理器时遇到问题。我用它来替换我的应用程序设置中 connectionString 上的用户名和密码,在开发和 QA 环境中一切正常,但在生产环境中(我没有完全访问权限)它没有。问题是当我从目标加载凭据时 returning 空字符串。
这是我加载它的地方:
public static CredentialModel GetCredential(string target)
{
CredentialModel credentialDto = new CredentialModel();
using var credential = new Credential
{
Target = target
};
credential.Load();
credentialDto.UserName = credential.Username;
credentialDto.Password = credential.Password;
return credentialDto;
}
这是 CredentialModel
public class CredentialModel
{
public string UserName { get; set; }
public string Password { get; set; }
}
以及我在 connectionString 中替换凭据的位置:
StringBuilder connectionString = new(host.Configuration.GetConnectionString("RemessasConnectionString"));
var credential = CredentialService.GetCredential("Pegasus");
connectionString.Replace("$userId", credential.UserName);
connectionString.Replace("$password", credential.Password);
ConnectionString = connectionString.ToString();
为了调试,我在日志中添加了一行以查看添加到 connectionString 中的内容,并且在生产中用空字符串替换它,但在开发中使用实际值。
我对此有一个想法,应用程序是 运行 一个 windows 用户,该用户无权访问生产服务器中的 windows 凭据管理器(但我认为这会 return 一个错误,而不仅仅是空字符串)。
如果有人能指出我正确的方向,或者有任何建议让我尝试,我会洗耳恭听。
正如@richard-deeming 指出的那样,这是因为用户 运行 应用程序无权访问存储的凭据,因为它们存储在与 [=13= 不同的帐户下] 服务。查看他的评论了解更多详情。