9

我有一个我编写的控件,它有一个 javascript 组件和一个 Web 服务组件。我遇到的问题是javascript设置为:

setInterval(this._checkAlertsHandler, this._messageCheckInterval * 1000);

这会调用一个函数,该函数会像这样进行 Web 服务调用:

Alert.SiteAlertService.GetAlerts(this._receivedAlertsHandler, this._errorReceivedAlertsHandler);

所以这是使用 Web 服务 javascript 代理方法来访问 Web 服务。问题是我们的应用程序具有表单身份验证和超时值,因此如果用户空闲时间过长,它会将他们注销。

我的 web 服务调用显然将包含会话和表单身份验证密钥的 cookie 发送到 web 服务。asp.net web 服务然后自动更新会话和表单身份验证。每次 javascript 访问 Web 服务时,它基本上都会让用户保持活力。我不想要这种行为,这应该只是规避它,所以即使这个 js 正在访问 Web 服务以检查新消息,如果用户没有对我们的应用程序进行回发(并且实际上是空闲的)它会仍然将它们注销。这没有发生:(

我想要发生的是对 Web 服务的此间隔调用不会更新任何身份验证(会话更新我可以通过使用应用程序级变量和用户会话 ID 的字典键/值来解决,所以我不必使用任何会话级变量)。

我如何做到这一点/更改我的 Web 服务/或控制以按照我想要的方式工作?

4

4 回答 4

7

我也在研究不同的方法。我这样做的一种方法是将其添加到 Ajax 服务端点:

// Hide the cookie so this call doesn't extend the user's ticket
HttpContext ctx = HttpContext.Current;
ctx.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);

这样您就可以取消 Auth Ticket 续订,因为更新的 cookie 永远不会返回给客户端。

如果您有多个要排除的 Ajax 端点,则可以实现一个模块来识别这些端点并包含用于从响应中删除 cookie 的代码。

于 2011-08-18T15:48:03.887 回答
1

@RyanW 提供了我需要的答案,所以这是我的 MVC 实现,它使用一个属性来保持干燥。

using System.Web.Mvc;
using System.Web.Security;

namespace Your.Web.Attributes
{
    public class RemoveAuthCookieAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
            base.OnActionExecuted(filterContext);
        }
    }
}

执行:

[RemoveAuthCookie]
public ActionResult PollMe()
{
    return View();
}
于 2013-07-17T07:19:34.227 回答
0

您可以从表单身份验证中排除您的网络服务:

<location path="yourwebservice.asmx">
    <system.web>
        <authorization>
            <allow users="?"/>
        <authorization>
    </system.web>
</location>  

但是您可能需要有关用户的信息,因此您可以将 web 服务配置为使用表单身份验证,但停用SlidingExpiration

<location path="yourwebservice.asmx">
    <system.web>
        <authentication mode="Forms">
            <forms slidingExpiration="false"></forms>
        </authentication>
    </system.web>
</location>  

一定要测试如果表单 cookie 过期会发生什么。也许您也必须重新定义 loginurl。

于 2010-06-23T17:55:22.380 回答
0

你能把你的 webservice asmx 文件放到它自己单独的项目/解决方案/应用程序中吗?

这样,它应该对您的主应用程序使用不同的会话 ID。

于 2011-02-18T14:44:46.490 回答