我正在创建一个网页,它可以将 SAMLResponse(以及其他属性)从 SiteMinder 重定向到客户端的身份服务器。我可以像这样在前端设置表单变量:
<asp:hiddenfield id="SAMLResponse" runat="server" ></asp:hiddenfield>
在后端,我正在解析来自 Request InputStream 的 SAML 值,如下所示:
private string RequestBody()
{
var bodyStream = new StreamReader(HttpContext.Current.Request.InputStream);
bodyStream.BaseStream.Seek(0, SeekOrigin.Begin);
string bodyText = bodyStream.ReadToEnd();
return bodyText.Substring(bodyText.IndexOf("=") + 1);
}
通过一些日志记录语句,我可以看到我成功地解析了 SAMLResponse 值,但是当我通过 asp:hiddenfield 或 document.getElementById 将 saml_response 值传递给 Web 表单时,该值显示为空白。但是,对值进行硬编码是可行的。这是我将值从后端传递给 hiddenfield/form 元素时的样子:
saml_response = RequestBody();
SAMLResponse.Value = saml_response;
我已经尝试过上述方法和下面的方法(前端)并且都适用于硬编码,但在尝试传递已解析的 SAML 响应时却不行:
var samlresponse = "<%=saml_response%>";
document.getElementById("SAMLResponse").Value = samlresponse;
我在画一个空白,整天都卡在这个上面!关于为什么这不起作用或我应该如何进行的任何建议?我认为这可能与进程异步运行和覆盖变量值有关,但我不能确定。
提前致谢!
编辑: 我发现 SiteMinder 正在发送第一个请求,一个 POST(使用 SAML),然后其他东西正在触发一个 GET。第二个请求再次触发我的后端代码并覆盖 SAMLResponse。尽管这是一个不同的请求,但有什么方法可以保留原始值吗?
最佳答案
在您的代码隐藏中尝试将值传递给设置隐藏字段的 javascript 函数。
System.Web.UI.ScriptManager.RegisterClientScriptBlock(this.Page, typeof(string), "SetResponse", "SetResponse('" + saml_response + "');", true);
Javascript:
function SetResponse(Res) {
var data = Res;
$(function () {
$('#SAMLResponse').val(data);
});
}
在脚本开始之前添加 jQuery 库
<script src="../jquery/jquery-1.7.js" type="text/javascript"></script>
也可以在该函数中设置警报 alert("works yo"); 我们需要确保脚本在执行该函数之前不会中断。
关于c# - 如何在 ASP.NET Web 应用程序中设置表单变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51644913/