3

我正在使用以下技术开发一个网站:

MVC 4 EF 5 Web Api Future - 可能的 Windows Phone/Windows 8 应用程序。

我正在使用 Web API,因此我有一个可以在其他客户端上使用的开发 api。

但是,每次向 API 发出请求时,我都需要授权用户。我最初的想法是通过 HTTP 标头执行此操作。但是,我只是想知道如果我要开发手机/win 8 应用程序,是否应该只使用 MVC 控制器而不是 Web API 来创建 MVC 应用程序并创建一个 RESTful api,再次需要对用户进行身份验证。所以原来的问题依然存在。

人们的想法是什么?任何人都可以向我指出如何通过 HTTP 标头安全地传递经过身份验证的用户详细信息的教程,这也是一步一步的教程,因为我将从头开始学习并需要理解它。

4

1 回答 1

1

我使用基本身份验证来传递授权凭据。这会将凭据放在标题中。使用 JQuery ajax函数的beforeSend事件处理程序非常简单。这是一个如何执行此操作的示例。

    getAuthorizationHeader = function (username, password) {
      var authType;
      var up = $.base64.encode(username + ":" + password);
      authType = "Basic " + up;
    };
    return authType;
 };

    $.ajax({
        url: _url,
        data: _data,
        type: _type,
        beforeSend: function (xhr) {
            xhr.setRequestHeader("Authorization", getAuthorizationHeader(username, password));
        },
        success: ajaxSuccessHandler,
        error: ajaxErrHandler
    });

这对在标头中发送的用户名/密码进行编码。请注意,仅依靠编码是不够的安全性,因为它很容易解码。您仍然希望使用 HTTPS/SSL 来确保通过网络发送的信息是安全的。

在 Web API 端,您可以创建一个自定义AuthorizeAttribute,它从标头中获取凭据、解码它们并执行您的授权过程。Web API 使用了一个单独的AuthorizeAttribute ,而不是控制器。创建自定义AuthorizeAttribute时,请务必使用System.Web.Http.AuthorizeAttribute作为基类。他们有不同的行为。用于控制器的那个将要重定向到登录页面,而用于 Web API 的那个会返回一个指示成功或失败的 HTTP 代码。如果授权未能区分由于授权而不是身份验证导致的失败,我将返回一个 HTTP 代码 Forbidden,以便客户端可以做出相应的反应。

这是一个示例方法,用于从可以在自定义AuthorizeAttribute中使用的标头中获取凭据。

    private bool GetUserNameAndPassword(HttpActionContext actionContext, out string username, out string password)
    {
        bool gotIt = false;
        username = string.Empty;
        password = string.Empty;
        IEnumerable<string> headerVals;
        if (actionContext.Request.Headers.TryGetValues("Authorization", out headerVals))
        {
            try
            {
                string authHeader = headerVals.FirstOrDefault();
                char[] delims = { ' ' };
                string[] authHeaderTokens = authHeader.Split(new char[] { ' ' });
                if (authHeaderTokens[0].Contains("Basic"))
                {
                    string decodedStr = SecurityHelper.DecodeFrom64(authHeaderTokens[1]);
                    string[] unpw = decodedStr.Split(new char[] { ':' });
                    username = unpw[0];
                    password = unpw[1];
                }
                gotIt = true;
            }
            catch { gotIt = false; }
        }

        return gotIt;
    }

这是用于解码此方法中使用的标头数据的代码。

    public static string DecodeFrom64(string encodedData)
    {

        byte[] encodedDataAsBytes

            = System.Convert.FromBase64String(encodedData);

        string returnValue =

           System.Text.Encoding.ASCII.GetString(encodedDataAsBytes);

        return returnValue;

    }

获得用户名和密码后,您可以执行授权过程并将适当的 HTTP 代码返回给客户端进行处理。

2013 年 3 月 8 日更新

我写了一篇博文,详细介绍了如何使用 SimpleMembership 实现这一点,它是 MVC 4 Internet 应用程序的默认成员提供程序。它还包括一个实现此功能的可下载 VS 2012 项目。

于 2013-01-03T14:43:11.987 回答