Web API的安全方法

时间:2013-04-23 19:25:45

标签: asp.net-mvc rest asp.net-web-api

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

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

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

我如何在WebAPI上实施安全性?我是否应该使用令牌系统,我可以在客户端上有登录表单,接收凭据,登录,然后返回一个令牌,在每次通话时都会发送回服务器?

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

2 个答案:

答案 0 :(得分:0)

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

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

它还使用querystring参数击败了需要签名URI的其他系统,这些丑陋且令人讨厌可靠的REStfulness,或带有一个令牌(通常作为cookie传递)。

答案 1 :(得分: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);
}

显然需要在控制器方法中进行授权。