我正在使用AngularJS开发一个ASPN.NET WEB API 1(带有.NET framework 4.0)应用程序,我正在使用session来验证用户(我知道它应该是无状态的,但是为了遗留目的,我正在使用session) 。在我的应用程序中,在我对WEB API发出的每个请求中,它都会创建一个新会话,即使我将值设置为会话。
通过Global.asax中的以下代码允许在我的应用中进行会话:
protected void Application_BeginRequest(object sender, EventArgs e)
{
string origins = ConfigurationManager.AppSettings["cors-origins"];
bool hasSlash = origins.Substring(origins.Length - 1, 1) == "/";
if (hasSlash)
origins = origins.Substring(0, origins.Length - 1);
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", origins);
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers",
"Content-Type, Accept");
HttpContext.Current.Response.End();
}
}
protected void Application_PostAuthorizeRequest()
{
if (IsWebApiRequest())
{
HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}
}
然后我在控制器中为我的会话设置值:
public HttpResponseMessage Post(LoginViewModel model)
{
// SOME BUSINESS LOGIC HERE...
FormsAuthentication.SetAuthCookie(model.User, false);
HttpContext.Current.Session["usuario"] = model.User;
return Request.CreateResponse(HttpStatusCode.Accepted, "User successfylly logged in!");
}
但是当我向我的应用程序发出另一个请求以访问控制器中的另一个方法时,它会抛出一个错误,因为session是null,就像在这个方法中一样:
public HttpResponseMessage Get()
{
var userName = HttpContext.Current.Session["usuario"];
return Request.CreateResponse(HttpStatusCode.Accepted, userName);
}
在我的web.config中,会话配置如下:
<sessionState mode="InProc" customProvider="DefaultSessionProvider" >
<providers>
<add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
</providers>
</sessionState>
PS:它在Chrome上不起作用,但在IE上它可以正常工作,直接在邮递员上提出请求也可以。
答案 0 :(得分:1)
我的Application_BeginRequest
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
在AngularJS的每个请求中,我应该将withCredentials参数传递为true。为此,我将此行放在AngularJS中的配置文件中:
$httpProvider.defaults.withCredentials = true;