我在ASP.NET Webform中有一个WebMethod,位于foo.aspx页面后面的代码中
[WebMethod]
public static String foo()
{
return "";
}
我使用jQuery调用它
$.ajax({
type: "POST",
url: '<%= ResolveUrl("foo.aspx/foo")%>',
data: JSON.stringify(dataToServer),
contentType: "application/json; charset=utf-8",
success: function (data ) {
// work with data here
}
});
这是来自服务器的响应头
Request
Request Method:POST
Status Code:401 Unauthorized
2:2
Cache-Control:private
Content-Length:105
Content-Type:application/json; charset=utf-8
Date:Tue, 20 Jan 2015 04:40:36 GMT
jsonerror:true
Server:Microsoft-IIS/7.5
X-Powered-By:ASP.NET
回应机构
{"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"}
背景资料
我在我的网站上使用WebApi,不知道是否 与此相关。这是我的路由配置
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{name}"
);
RouteTable.Routes.MapHttpRoute(
name: "DefaultApiNoParameter",
routeTemplate: "api/{controller}/{action}"
);
我构建的网站作为子应用程序托管在另一个网站中 ASP.NET应用程序。因此,让我们在域名foo.com上调用我的应用栏,它位于foobar中,http://foo.com/foobar/bar。有时,经过多次刷新后,浏览器会弹出&#34;网站http://foo.com:80需要您输入密码等等等等。&#34;。所有站点都启用了匿名身份验证并启用了表单身份验证,其他身份验证已被禁用。
这是我的web.config身份验证设置,其思路是 应用程序是公共的,只有foo.aspx是私有和密码 保护。
<authentication mode="Forms">
<forms name="cookie" loginUrl="login.aspx" defaultUrl="foo.aspx">
<credentials passwordFormat="SHA1">
<user name="foo"
password="xxxxxxxx"/>
<user name="bar"
password="xxxxxxxxx"/>
</credentials>
</forms>
</authentication>
应用程序在测试环境中运行良好 单个Web服务器。仅在部署到Web场时才出现此问题 发生的情况。
答案 0 :(得分:1)
应用程序在单个Web服务器的测试环境中运行良好。只有在部署到Web场时才会出现此问题。
这通常发生在加密/解密密钥不匹配所有实例
时如果您使用SHA1
哈希密码,则需要确保网站的所有实例共享相同的machineKey
,以便哈希算法可以正确地散列密码。
您可以通过将相应的密钥添加到web.config
文件来实现,例如......
<machineKey decryption="AES"
validation="SHA1"
decryptionKey="22B83C3D43B0BA0E2"
validationKey="1C059088E7E510C83650449D8D6567B2" />
在与machineKey
值相关的...key
元素的MSDN文档中引用...
指定手动分配的密钥。必须手动将此值设置为 一串十六进制字符,以确保一致的配置 跨Web场。密钥应为16个十六进制字符 使用DES加密时的长度和48个十六进制字符 使用Triple DES(3DES)或AES加密时的长度。如果键更短 使用的最大长度,应由a创建 真正随机的方法,例如使用RNGCryptoServiceProvider 类。 ASP.NET只能在128位的计算机上使用Triple DES 加密可用。
有关信息,请参阅MSDN