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

Sha*_*ean 50 rest asp.net-mvc asp.net-web-api

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

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

问题:

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

cec*_*lip 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;
    } }
Run Code Online (Sandbox Code Playgroud)

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

让我们来看看吧

  1. 客户端请求安全数据
  2. 客户未经授权,返回带有未授权状态代码的回复
  3. 客户端发送凭据进行身份验证,应通过HTTPS保护
  4. 验证后,客户端通过HTTP标头或任何适合您的标记接收令牌
  5. 客户端尝试再次请求安全数据,这次将令牌附加到请求
  6. AuthorizeTokenAttribute将验证令牌并允许执行操作.

另外,请查看John Petersen的这篇文章.使您的ASP.NET Web API安全

  • 另请查看John Petersen的更新帖子,他使用Http消息处理程序代替Action过滤器http://codebetter.com/johnvpetersen/2012/04/04/moving-from-action-filters-to-message-handlers/ (2认同)

Mau*_*ice 21

有许多方法可以为REST服务验证用户身份.使用令牌是可能的,但只使用基本身份验证更简单,并且可以作为标准和跨平台.

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

最好的资源是Dominick Baier,他是这方面的专家.