“&”字符会破坏存储在web.config中的密码


71

我有一个在IIS 7.5上运行的ASP.NET MVC3 C#.NET应用程序。

我们在代码中拥有一个模拟的Windows NT服务帐户,以便将文档读/写到文件共享。用户ID将在代码中编译,服务帐户密码存储在web.config文件中。

密码包含一个&字符(即:)p&ssword

这破坏了网站。访问该网站时,我们收到此错误:“对不起,处理您的请求时发生错误”。

这是使用密码的代码:

    var password = ConfigurationManager.AppSettings.Get(Common.SVC_PWD);

    bool isSuccess = LogonUser(
        @"my_svc_acct",
        "my.domain.net",
        password,
        LOGON32_LOGON_NEW_CREDENTIALS,
        LOGON32_PROVIDER_DEFAULT, ref token
    );

为什么这会导致站点损坏?


5
我想是因为web.config中是作为一个XML文档处理-在这里看到stackoverflow.com/questions/3824351/...
斯科特·塞尔比

2
我的第一个猜测是配置文件中的密码不正确。但是,您是否尝试过调用GetLastError(msdn.microsoft.com/en-us/library/windows/desktop/…)以查看错误是什么?我还必须补充一点,在配置文件中存储明文密码不是一个好主意。我至少要对其加密。
杰夫·西弗

Answers:


133

我怀疑您没有在web.config文件中正确编码密码。请记住,这web.config是一个XML文件,因此必须对实体进行编码。

代替

my&password 

尝试

my&password

您可以使用FreeFormatter.com等网站来转义/取消转义XML字符串。


2
每个人都如何将其用作URL时要小心!带有“&”的网址 不是带有“&”的网址。在将其应用于您的URL地址之前,请不要忘记用代码替换它。我陷入了这个陷阱,整天都在处理一个错误,然后才找到原因。
Mr.B

55

您需要将编码后的值放在web.config中。一旦将其拉出,它将正确读出,但需要在配置文件本身中对其进行编码。

例如:

密码:(your&password 您所期望的)

编码版本:(your&password 应该存储在您的web.config中)

读取值的包装方法应将其自动取消编码为your&password

您将需要对所有“特殊”字符执行此操作:

< = &lt;
> = &gt;
" = &quot;
' = &apos;
& = &amp;

1
我正在使用VS2015,其中&amp; 或&#38; 两者的结果相同,即“&amp;” 但是我想要“&”
Purushoth

0

使用CDATA将密码存储在web.config中

用这个替换密码

<![CDATA[MyPassw&rd]]>

8
无法使用:您无法将CDATA节放在属性值内。
2013年

3
Joe是正确的,它不能在配置文件中用作属性值
user99513

@ user99513提示:如果您同意某人的评论,则可以对他/她的评论进行投票,而不必撰写仅提及您同意先前评论者的新评论。
user1451111 '19

3
我完全@ user1451111同意
Halvard
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.