0

我目前有一个 ASP.NET MVC 4 网站,其中成员有一个帐户,可以使用 Facebook 和我自己的登录表单登录。然后我使用 FormsAuthentication。

接下来我想构建一个 API,使用 WebAPI 并将我的一些功能公开给我计划构建的移动客户端。

我没有任何让其他人使用我的 API 的计划,所以这仅适用于我构建的客户端。

我将如何在 WebAPI 上实现安全性?我是否应该使用令牌系统,在该系统中我可以在客户端上有一个登录表单、接收凭据、登录并返回一个令牌,该令牌将在每次调用时发送回服务器?

我应该在服务器上实现 oAuth 吗?

4

2 回答 2

0

尝试完全 RESTful:使用 HTTP 的内置身份验证系统,其中身份验证信息由客户端在每个请求中提供。如果您使用 SSL,您也可以使用 HTTP 基本身份验证而没有任何安全问题,否则 HTTP Digest 对于此目的也足够安全。

您将需要为 ASP.NET 实现自己的 HTTP 基本身份验证提供程序,幸运的是它很简单(而且很有趣!)。

它还击败了其他需要使用查询字符串参数签名的 URI 的系统,这很丑陋并且会弄乱可爱的 RESTful,或者携带一个令牌(通常作为 cookie 传递)。

于 2013-04-23T19:53:57.860 回答
0

除了关于如何进行身份验证的圣战之外,您可以只使用表单身份验证。如果您还使用来自同一站点/域的 Web 界面,并且您的身份验证内容已得到充分考虑,那么这真的很方便和容易。

你的 api 控制器需要一个基类

public class MyApiControllerBase : ApiController
{
    public MySecurityContextType SecurityContext { get; set; }
}

一个ActionFilterAttribute

public class AuthenticationContextAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        MyApiControllerBase controller = actionContext.ControllerContext.Controller as MyApiControllerBase ;
        if (controller != null)
        {

            var context = ((HttpContextBase)controller.Request.Properties["MS_HttpContext"]);

            HttpCookie cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName];
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);

            controller.SecurityContext= ParseFormsAuthenticationTicket(ticket);
        }
    }
}

和代码首先创建票证。

LogIn(HttpRequestBase httpRequest, string userName, string password)
{
    var context = DoLoginLogic(userName,password);
    FormsAuthentication.SetAuthCookie(context, usePersistentCookies);
}

授权显然需要在控制器方法中完成。

于 2013-04-23T20:09:25.070 回答