更新:
我已将代码更改为FormsAuthentication.SetAuthCookie(_model.UserName, true);
. 我确实有 2 个 Web.config 文件,1 个用于 MVC,另一个用于 WebAPI。在 MVC 配置中,我定义了
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
两个应用程序都在同一个域上。
更新:我们是否应该在 WebAPI 中使用 cookie?
目前,我有一个使用表单身份验证的 MVC 项目和一个 WebAPI 项目。问题是我无法在 WebAPI 项目中获取与请求关联的用户。我认为这是可能的,或者可能实施是错误的?
注意:我将 cookie 代码放在 WebAPI 控制器方法中作为测试,它不是应该在的地方。
MVC - 处理登录请求,创建身份验证票。
// POST: /Account/Login
[AllowAnonymous]
[HttpPost]
public ActionResult Login(LoginModel _model, string _returnUrl)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(_model.UserName, _model.Password))
{
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(_model.UserName, true, 15);
string encryptedTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
Response.Cookies.Add(cookie);
// set redirect
}
}
// If we got this far, something failed, redisplay form
return View(_model);
}
WebAPI - 处理更新请求
[AcceptVerbs("PUT")]
public HttpResponseMessage UpdateInfo(int _id, ExampleModel _model)
{
try
{
HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
string encTicket = authCookie.Value;
if (!String.IsNullOrEmpty(encTicket))
{
// decrypt the ticket if possible.
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(encTicket);
var userData = ticket.UserData;
}
}
// do update
return Request.CreateResponse(HttpStatusCode.OK, data, GlobalConfiguration.Configuration);
}
catch (Exception err)
{
m_logger.Error(err);
throw;
}
}