【问题标题】:Security approach for WebAPIWebAPI 的安全方法
【发布时间】:2013-04-23 19:25:45
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    除了关于如何进行身份验证的圣战之外,您可以只使用表单身份验证。如果您还使用来自同一个站点/域的 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);
    }
    

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

    【讨论】:

    • 您可以通过向控制器操作方法添加属性来简化授权实现。
    • 这真的取决于你的授权方案。如果您需要授权级别(例如管理员与非管理员),请确定。如果您需要对象级授权,则使用操作过滤器更难使其变得简单。
    猜你喜欢
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2017-03-29
    • 2017-07-21
    • 2013-11-03
    • 2012-08-29
    相关资源
    最近更新 更多