使用ASP.NET Web API进行跨平台身份验证

时间:2012-03-26 23:50:52

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

我如何使用ASP.NET Web API开始编码身份验证,因此它是支持桌面,移动和Web的跨平台?我读过一些做RESTful身份验证的方法,比如在标题中使用标记。

是否有任何使用此方法的示例项目?

问题:

  1. 如果不是,如何修复[Authorize]属性以读取令牌?
  2. 如何生成此令牌?我不认为我可以使用formsauthentication,因为它使用cookies。
  3. 如何处理实际授权,客户端发送原始密码和用户名然后生成令牌还是有其他方式?
  4. 我的网站使用时如何处理?我听说这个处理方式与应用程序使用它时的处理方式不同,例如获取域名并进行授权。

4 个答案:

答案 0 :(得分:42)

我认为令牌将是一条可靠的方式。表单身份验证基于Web的Cookie。不过,对于所有非浏览器客户端来说,这不是最有意义

我建议创建自定义AuthorizationFilterAttribute并覆盖OnAuthorization方法。在该方法中,您可以检查是否存在您在提供有效凭据后发给客户端的令牌。您可以在要验证的任何方法或控制器上使用此属性。以下是您可能会参考的示例

 public class AuthorizeTokenAttribute : AuthorizationFilterAttribute 
{      
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext != null)
        {                
                if (!AuthorizeRequest(actionContext.ControllerContext.Request))
                {
                    actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) { RequestMessage = actionContext.ControllerContext.Request }; 
                }
                return;
        }
    }

    private bool AuthorizeRequest(System.Net.Http.HttpRequestMessage request)
    {
        bool authorized = false;
        if (request.Headers.Contains(Constants.TOKEN_HEADER))
        {               
            var tokenValue = request.Headers.GetValues("TOKEN_HEADER");
            if (tokenValue.Count() == 1) {
                var value = tokenValue.FirstOrDefault();               
               //Token validation logic here
               //set authorized variable accordingly
            }                
        }
        return authorized;
    } }

TOKEN_HEADER只是一个字符串,表示客户端应该为经过身份验证的请求传回的HTTP标头。

让我们一起来看看

  1. 客户请求安全数据
  2. 客户未获授权,返回带有未经授权状态代码的回复
  3. 客户端发送凭据进行身份验证,应通过HTTPS保护
  4. 验证后,客户端会通过HTTP标头或任何适合您的标记接收令牌
  5. 客户端尝试再次请求安全数据,这次将令牌附加到请求
  6. AuthorizeTokenAttribute将验证令牌并允许执行操作。
  7. 另外,请查看John Petersen的这篇文章。 Making your ASP.NET Web API’s secure

答案 1 :(得分:21)

有很多方法可以为REST服务验证用户身份。使用令牌是可能的,但只使用Basic Authentication甚至更简单,并且可以作为标准和跨平台使用。

请勿将authorizationauthentication混淆。 [Authorize]属性是关于授权的,但仅在用户使用其他机制进行身份验证之后。如果没有先进行适当的身份验证,授权就完全没用了。

要检查的最佳资源是Dominick Baier谁是该主题的专家。

答案 2 :(得分:2)

我使用一种非常简单的方法:

  1. 使用其唯一的accessId和accessKey定义访问配置文件(例如,MD5散列的GUID值)
  2. 在数据库中存储此类访问配置文件
  3. 每个请求(GET / POST /等)必须提供accessId,queryHash(MD5哈希值表示查询)和签名(queryHash + accessKey的MD5哈希值)。当然,客户需要将accessKey保存在安全的地方!!!
  4. 服务器获取请求将使用相同的计算算法检查accessId和签名以拒绝或授予访问权限(authenticate)
  5. 可以使用访问配置文件
  6. 在请求类型的基础上进行进一步授权

    使用新的ASP.NET MVC Web API的这种方法的服务可以服务于任何类型的客户端:浏览器/ javascript和本机(桌面或移动)等。

答案 3 :(得分:0)

你可以使用ActionFilterAttribute并覆盖OnActionExecuting方法。 稍后在global.cs中注册此过滤器,以将此过滤器应用于Application Start方法

中的所有操作

var config = GlobalConfiguration.Configuration;             config.Filters.Add(new CustomAuthAttribute());

{ 命名空间Customss { 公共类CustomAuthAttribute:ActionFilterAttribute

{

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        // To inforce HTTPS if desired , else comment out the code
        if (!String.Equals(actionContext.Request.RequestUri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
            {
                Content = new StringContent("HTTPS Required")
            };
            return;
        }

       // get toekn from the header

        var userToken = actionContext.Request.Headers.GetValues("UserToken");
         // Customer Logic to check the validity of the token.
        // U can have some DB logic to check , custom STS behind or some loca cache used to compare the values


    }


}

} }