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

Asp.net mvc 使用ASP.NET Web API进行跨平台身份验证,asp.net-mvc,rest,asp.net-web-api,Asp.net Mvc,Rest,Asp.net Web Api,我如何开始使用ASP.NET Web API编写身份验证代码,使其能够跨平台支持桌面、移动和Web?我读过一些进行RESTful身份验证的方法,比如在头中使用令牌 有没有使用这种方法的示例项目 问题: 如果没有,如何修复[Authorize]属性以读取令牌 如何生成此令牌?我认为我不能使用formsauthentication,因为它使用cookies 我如何处理实际授权,客户机是否发送原始密码和用户名,然后我生成令牌,或者是否有其他方法 当我的网站正在使用它时,我该如何处理?我听说这与应用程序

我如何开始使用ASP.NET Web API编写身份验证代码,使其能够跨平台支持桌面、移动和Web?我读过一些进行RESTful身份验证的方法,比如在头中使用令牌

有没有使用这种方法的示例项目

问题:

  • 如果没有,如何修复
    [Authorize]
    属性以读取令牌
  • 如何生成此令牌?我认为我不能使用formsauthentication,因为它使用cookies
  • 我如何处理实际授权,客户机是否发送原始密码和用户名,然后我生成令牌,或者是否有其他方法
  • 当我的网站正在使用它时,我该如何处理?我听说这与应用程序使用时的处理方式不同,比如获取域名并授权

  • 有很多方法可以对REST服务的用户进行身份验证。使用代币是可能的,但仅仅使用代币就更简单了,并且尽可能地标准化和跨平台

    别把它和你的名字混淆了。[Authorize]属性完全是关于授权的,但只有在使用其他机制对用户进行身份验证之后。如果不先进行适当的身份验证,授权是完全无用的


    检查的最佳资源是谁是这方面的专家。

    我认为代币将是一个可靠的方法。表单身份验证基于用于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头

    那么让我们来看看

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

  • 另外,请查看约翰·彼得森的这篇文章

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

  • 定义具有唯一accessId和accessKey的访问配置文件(例如MD5哈希GUID值)
  • 将这样的访问配置文件存储在数据库中
  • 每个请求(GET/POST/etc)必须提供accessId、queryHash(MD5散列值表示查询)和签名(queryHash的MD5散列值+accessKey)。当然,客户端需要将accessKey保存在一个安全的地方
  • 服务器获取请求时,将使用相同的计算算法检查accessId和签名,以拒绝或授予访问权(身份验证)
  • 可以利用访问配置文件根据请求类型进行进一步授权

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

    U可以使用ActionFilterAttribute并覆盖OnActionExecuting方法。 稍后,在global.cs中注册此筛选器,以便将此筛选器应用于应用程序启动方法中的所有类似操作

    var config=GlobalConfiguration.Configuration; 添加(新的CustomAuthAttribute())

    { 命名空间自定义 { 公共类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
    
    
        }
    
    
    }
    
    }
    }

    对于基本身份验证,这是执行此操作的方法是。使用HTTPS,因为编码仅为base64,而不是加密。Dominick Baier文章的链接是BrokenTanks,这很有帮助,您建议如何在身份验证期间生成令牌?生成guid并将其存储在数据库中?我想这取决于您。您可以使用Guid、哈希或某种类型的唯一值。取决于什么对你的应用程序真正有意义在你的代码注释中你说“相应地设置授权变量”…授权变量将设置在哪里?根据请求。属性?在其他地方?也可以查看John Petersen更新的帖子,他使用Http消息处理程序而不是操作过滤器。API应该有一些端点,允许身份验证/授权工作流。就像你有一个网站的登录页面,你可以考虑比MD5更强大的东西。在这一点上,它可以很快被破解,想想几分钟或几小时。您应该使用更强的散列,比如SHA256/512,或者最好是计算速度较慢的,比如bCrypt。这是一些有用的信息@EBarr(I+1'd you),但我认为在这种情况下,他使用MD5是安全的,因为他加密的内容对于彩虹表来说太大太模糊了。@Grinn rainbow tables是如此2005;-)。当然,md5可能做到了。然而,如今在一个强大的GPU上,Md5可以在几分钟内被强制使用。例如,一个amazon ec2 GPU盒只需几美元。@EBarr:我没有意识到这一点。谢谢