为什么设置cookie只能使用来自global.asax.cs的重定向?

时间:2016-10-13 16:04:31

标签: c# asp.net cookies asp.net-web-api2 httpcookie

我有一个WebApi2应用程序。站点的初始加载是为SPA应用程序加载静态内容。当我的Global.asax.cs文件如下所示时,cookie不会添加到响应中(如浏览器中的开发人员工具所示):

using System.Web.Http;
using System.Web;
using System.Security.Claims;
using System.Linq;

namespace Application
{
    public class WebApiApplication : HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);
        }

        protected void Application_PostAuthorizeRequest()
        {
            var claimsPrincipal = HttpContext.Current.User as ClaimsPrincipal;
            if (claimsPrincipal != null)
            {
                var cookie = new HttpCookie(".UIROLES", "admin");
                HttpContext.Current.Response.Cookies.Add(cookie);
            }
        }
    }
}

当我将其更改为具有查找该cookie的条件并重定向回根页面(无论如何正在加载)时,就会显示cookie(如浏览器中的开发人员工具所示)。以下是带有重定向的更新Global.asax.cs

using System.Web.Http;
using System.Web;
using System.Security.Claims;
using System.Linq;

namespace Application
{
    public class WebApiApplication : HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);
        }

        protected void Application_PostAuthorizeRequest()
        {
            var claimsPrincipal = HttpContext.Current.User as ClaimsPrincipal;
            if (claimsPrincipal != null)
            {
                if (HttpContext.Current.Request.Cookies[".UIROLES"] == null)
                {
                    var cookie = new HttpCookie(".UIROLES", "admin");
                    HttpContext.Current.Response.Cookies.Add(cookie);    
                    HttpContext.Current.Response.Redirect("http://localhost/Application");
                }
            }
        }
    }
}

我曾尝试阅读有关cookies和asp.net的一些文章,但我无法弄清楚为什么第一个版本不起作用而第二个版本不起作用。如果我的UI应用程序需要另一次访问服务器,我可以将它作为ApiController调用而不是获取数据,但在我看来,不需要额外的服务器之旅。

更新:我在Global.asax.cs尝试了很多其他“生命周期”事件。在HttpContext.Current.User方法之前我没有看到Application_AuthenticateRequest之前的位置(这是我实际获得角色的地方),但是在这一点之后的所有方法,实际上并不真实将cookie写入响应,除非重定向在代码中。例如,我可以在new HttpCookie("foo", "bar")方法中添加仲裁(Application_BeginRequest)Cookie,但此时HttpContext.Current.User为空。

为什么这样可以正常工作?

无论如何我可以在不需要重定向或额外的api调用的情况下获得第一组代码吗?

0 个答案:

没有答案