目前我正在使用支付网关与我的ASP.NET应用程序集成,我必须使用GET方法将少量表单变量发布到Payment Gateway页面。当我使用简单的HTML页面使用表单控件来保存值并将其发布到外部支付网关页面时,一切正常。
当我尝试从我的ASP.NET c#应用程序内部执行此操作时,我收到错误“viewstate MAC验证失败。如果此应用程序由Web场或群集托管,请确保配置指定相同的validationKey验证算法。无法在集群中使用AutoGenerate。“在检查从我的asp.net c#页面发布到外部支付网关页面的查询字符串时,还有一个额外的__VIEWSTATE变量附加到我想要的查询字符串,该字符串包含我想要发布到支付网关页面的变量值。
我已将EnableViewState =“false”EnableEventValidation =“false”EnableViewStateMac =“false”改为<%Page%>在ASPX页面中的指令,并在代码隐藏的重载onLoad方法中添加了“this.EnableViewState = false”。
供参考添加以下代码段:
ASPX页面
<body>
<%--<form id="pgform" name="pgform" action="http://xxx.xx.xx.xx:xxxx/_layouts/Portal/EWallet_BillDesk_Dummy.aspx" method="post" runat="server"> --%>
<form id="pgform" name="pgform" action="http://xxx.xxx.xx.xx:xxxx/PaymentGateway.aspx"
method="get" target="_blank" runat="server">
<asp:HiddenField ID="mid" runat="server"></asp:HiddenField>
<asp:HiddenField ID="mtrxid" runat="server"></asp:HiddenField>
<asp:HiddenField ID="mitem" runat="server"></asp:HiddenField>
<asp:HiddenField ID="amount" runat="server"></asp:HiddenField>
<script type="text/javascript">
document.pgform.submit();
//alert("connector fired");
</script>
</form>
</body>
代码
protected override void OnLoad(EventArgs e)
{
this.EnableViewState = false;
base.OnLoad(e);
}
protected void Page_Load(object sender, EventArgs e)
{
byte[] EncrKeyStream = Encoding.UTF8.GetBytes("nlxcK}~MWgf1WxrT");
if (Request.QueryString["c"] != null)
{
string qry = ConvertHexToString(Request.QueryString["c"]);
string strApplicationNo = qry.Split('|')[0];
string strTxnAmount = "1";//qry.Split('|')[1];
string mtrxId = "ABCMI" + strApplicationNo;
string mItem = "MOTOR INSURANCE";
string encmtrxId = EncryptDecrypt.Encrypt(mtrxId, EncrKeyStream);
string encmItem = EncryptDecrypt.Encrypt(mItem, EncrKeyStream);
string encAmount = EncryptDecrypt.Encrypt(strTxnAmount, EncrKeyStream); ;
mid.Value = "ABC_DEV";
mtrxid.Value = encmtrxId;
mitem.Value = encmItem;
amount.Value = encAmount;
}
}
请在这方面帮助我。我真的需要这个解决方案,现在已经有几个小时了。我找不到一个解决方案。请求你的帮助。
提前致谢。
答案 0 :(得分:1)
不要使用<form runat="server" />
或服务器端控件。使用标准<form>
和普通<input>
字段(所有字段均不使用 runat =&#34;服务器&#34; )。这样ASP.NET就不会代表您生成视图状态或其他隐藏字段,您可以提交表单跨主机。
我还提醒您让安全专家审核您的代码以及您使用加密技术。