我有一个带有 JSon 脚本的页面,当按下按钮时会触发该脚本。该脚本使用 Web 服务。为了保证安全,页面代码后面会生成一个脚本,其中包含一个包含生成代码的对象。然后将代码添加到页眉中。Web 服务应该验证此代码,但是当它尝试通过键获取标头值时,标头不存在(换句话说,标头不存在)。
生成代码和 javascript 对象的代码(在 .cs 文件中):
string cacheKey = User.Identity.Name + ":securityTicket";
string securityTicket = Guid.NewGuid().ToString();
Cache[cacheKey] = securityTicket;
string script = string.Format("SECURITY_TICKET = '{0}';", securityTicket);
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "securityKey", script, true);
添加标头的脚本(在 .aspx 文件中)
function onInvoke(sender, args) {
args.get_webRequest().get_headers()['securityTicket'] = SECURITY_TICKET;);
}
背后的网络服务代码(asmx.cs 或类似的东西) HttpContext context = HttpContext.Current;
string headerTicket = context.Request.Headers["securityTicket"];
if (string.IsNullOrEmpty(headerTicket))
{
throw new SecurityException("Security ticket must be present.");
}
string cacheKey = context.User.Identity.Name + ":securityTicket";
string cacheTicket = (string)context.Cache[cacheKey];
if (string.Compare(headerTicket, cacheTicket, false) != 0)
{
throw new SecurityException("Security ticket mismatched.");
}
问题是context.Request.Headers["securityTicket"]为空。
有什么建议么?谢谢!
更新:
网络服务:
namespace PV
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService()]
public class UserService : System.Web.Services.WebService
{
[WebMethod]
public bool ChangeUserPassword(object userID, object password)
{
EnsureTicket();
return PV.WebMethods.ChangeUserPassword(userID, password);
}
private void EnsureTicket()
{
HttpContext context = HttpContext.Current;
string headerTicket = context.Request.Headers["securityTicket"];
if (string.IsNullOrEmpty(headerTicket))
{
throw new SecurityException("Security ticket must be present.");
}
string cacheKey = context.User.Identity.Name + ":securityTicket";
string cacheTicket = (string)context.Cache[cacheKey];
if (string.Compare(headerTicket, cacheTicket, false) != 0)
{
throw new SecurityException("Security ticket mismatched.");
}
}
}
}
这页纸:
<script type="text/javascript" language="javascript">
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_beginRequest(beginRequest);
function beginRequest(sender, args) {
prm._scrollPosition = null;
postbackElement = args.get_postBackElement();
}
var postbackElement;
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginRequest);
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(pageLoaded);
function pageLoaded() {
Sys.Net.WebRequestManager.add_invokingRequest(onInvoke);
if (typeof (postbackElement) === "undefined") {
return;
}
if ((postbackElement.id).indexOf("btnSelect") !== -1) {
$("html, body").animate({ scrollTop: "300px" });
}
}
function ApplicationLoadHandler() {
// InitScript is a custom function
// registered from the User Control
if (typeof InitScript == 'function')
InitScript();
}
if (Sys && Sys.Application) {
Sys.Application.add_load(ApplicationLoadHandler);
Sys.Application.notifyScriptLoaded();
}
function pageUnload() {
Sys.Net.WebRequestManager.remove_invokingRequest(onInvoke);
}
function onInvoke(sender, args) {
args.get_webRequest().get_headers()['securityTicket'] = SECURITY_TICKET;
alert('Security ticket: ' + args.get_webRequest().get_headers()['securityTicket']);
}
</script>
<%
Response.Write(@"
<script>
function ResetPassword()
{
var password = document.getElementById(""password"").value;
var id = document.getElementById(""ctl00_ctl00_ContentPlaceHolder1_cphContent_hdnUsrID"").value;
var d = {""userID"" : id, ""password"" : password };
$.ajax
({
type: ""POST"",
url: """ + "" + @"http://localhost:2297/wwwroot/Services/UserService.asmx/ChangeUserPassword"",
data: JSON.stringify(d),
contentType: ""application/json"",
dataType: ""json"",
success: function()
{
document.getElementById(""password"").value = '';
alert('Succes');
$(""" + "#ctl00_ctl00_ContentPlaceHolder1_cphContent_pnlChangePassword" + @""").fadeOut();
$(""html, body"").animate
( {
scrollTop: $(""" + "#ctl00_ctl00_ContentPlaceHolder1_cphContent_pnlPerson" + @""").offset().top - 100
}, 1200);
},
error: function(msg)
{
if(msg === false)
{
alert('Error');
return;
}
}
})
}
function passwordChanged_Succes() {
alert('Changed');
}
function passwordChanged_Failed() {
alert('Failed');
}
</script>"); %>
该页面还包含一个更新面板。
后面的页面代码:
private void GenerateSecurityTicket()
{
string cacheKey = User.Identity.Name + ":securityTicket";
string securityTicket = Guid.NewGuid().ToString();
Cache[cacheKey] = securityTicket;
string script = string.Format("SECURITY_TICKET = '{0}';", securityTicket);
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "securityKey", script, true);
}
protected void Page_Load(object sender, EventArgs e)
{
this.GenerateSecurityTicket();
}