我创建了 2 个非常简单的方法:
[Authorize]
[HttpGet]
public string getUser()
{
return User.Identity.Name;
}
[HttpPost]
public bool SignIn(Credentials cred)
{
var user = userRepository.ValidateUser(cred);
if (user != null)
{
if (user.IsActive)
{
FormsAuthentication.SetAuthCookie(userRepository.GetUserIdByEmail(cred.Email).ToString(), cred.RememberMe);
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
user.UserId.ToString(),
DateTime.UtcNow,
DateTime.UtcNow.AddDays(Convert.ToInt32(ConfigurationManager.AppSettings["CookieTimeoutInDays"])),
true,
"MyTicket",
FormsAuthentication.FormsCookiePath);
//Encrypt the ticket.
string encTicket = FormsAuthentication.Encrypt(ticket);
//Create the cookie.
HttpCookie mycookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
// Set the cookie's expiration time to the tickets expiration time
if (ticket.IsPersistent)
mycookie.Expires = ticket.Expiration;
Response.AddHeader(FormsAuthentication.FormsCookieName, encTicket);
return true;
}
else
return false;
}
else
{
return false;
}
}
我将这些函数放在一个 API 控制器和一个普通控制器中(唯一不同的是HttpContext.Current.Response.AddHeader(FormsAuthentication.FormsCookieName, encTicket);
它在 api 控制器中时)。当我使用普通控制器进行身份验证并将相同的 cookie 传回以调用getUser()
它时,它可以工作,但是当我对 API 控制器执行此操作时,它不起作用..我使用移动设备来调用这两个控制器,而不是浏览器。现在我了解 API 控制器通常通过在每次调用的标头中传递用户名和密码来使用基本身份验证,但是从普通控制器执行此操作有什么问题吗?与普通控制器相比,使用 asp.net Web API 有什么优势?