在web api中进行身份验证与在普通web应用中进行身份验证

本文关键字:身份验证 web 应用 api | 更新日期: 2023-09-27 18:08:44

我创建了两个非常简单的方法:

[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的优势是什么?

在web api中进行身份验证与在普通web应用中进行身份验证

当我使用正常控制器进行身份验证并将相同的cookie传递回调用getUser()时,它可以工作,但当我对API控制器执行此操作时,它不工作

我不知道为什么会这样。如果你使用的是普通模板,请注意你的ApiController将位于/api路由下,并且动作名称不会成为URL的一部分。如果你的WebApiConfig说:

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

和你的控制器类命名为FooController,那么你的ApiController url将是这样的:http://: 33504/api/Foo

(GET和POST都适用)。

将cookie与Web API一起使用通常不是最好的方法,但如果您有特殊需要,这是可能的。

还有几个地方你可能会被绊倒:

  1. 你生成了两次表单验证cookie。SetAuthCookie行只做一次,并把它放在一个cookie header中。然后是响应。AddHeader再次这样做,把它放在一个自定义头(不是一个cookie头)。

  2. 当你说Response.AddHeader(FormsCookieName)我想你的意思是:Response.SetCookie(myCookie)。您当前的代码正在添加一个名为FormsCookieName的自定义头;它没有添加一个cookie(在Set-Cookie头)与该cookie名称。

  3. 对于Web API,通常不建议使用HttpContext.Current.Response。相反,可以考虑返回HttpResponseMessage并在该对象上设置报头属性。

现在我理解API控制器通常使用基本的身份验证通过在每个调用的头部传递用户名和密码,但是从一个正常的控制器做它有什么错吗?

当你使用Web API时,你通常是在做REST,而cookie不太适合那里的超媒体思想。如果您不使用超媒体/REST,那么我认为您可以使用cookie,尽管它通常不是最合适的。

使用asp.net web API优于普通控制器的优点是什么?

Web API为您提供了一个自主机故事、进行内容协商的能力和一个不错的HTTP编程模型。MVC是专门围绕HTML设计的(而不是其他内容类型)。如果你返回HTML, MVC可能是有意义的。如果你的应用中没有任何东西返回HTML,那么Web API可能是一个更好的选择。

对于这一个控制器,我会做你在应用程序的其他部分做的任何事情(我不会为这一个控制器选择一个不同的框架)