我有一个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调用的情况下获得第一组代码吗?