使用REST api的Guid令牌而不是用户名/密码进行基本身份验证 概述

使用REST api的Guid令牌而不是用户名/密码进行基本身份验证 概述,rest,authentication,oauth,asp.net-web-api,Rest,Authentication,Oauth,Asp.net Web Api,我正在开发一个移动应用程序,使用PhoneGap和RESTAPI作为后端。RESTAPI不会被第三方开发人员使用,而是特定于应用程序的,因此不需要实现oAuth。因此,我计划使用基本身份验证,用户在其中输入用户名/密码以访问API资源。所有API通信都将在SSL上进行 使用令牌的基本身份验证 与其让应用程序存储用户名/密码并将其与每个请求一起发送到API,我宁愿在第一个登录请求上验证用户名/密码,并将GUID令牌发送回来。客户端存储此GUID令牌,并通过授权标头将令牌与每个请求一起发送回API,

我正在开发一个移动应用程序,使用PhoneGap和RESTAPI作为后端。RESTAPI不会被第三方开发人员使用,而是特定于应用程序的,因此不需要实现oAuth。因此,我计划使用基本身份验证,用户在其中输入用户名/密码以访问API资源。所有API通信都将在SSL上进行

使用令牌的基本身份验证 与其让应用程序存储用户名/密码并将其与每个请求一起发送到API,我宁愿在第一个登录请求上验证用户名/密码,并将GUID令牌发送回来。客户端存储此GUID令牌,并通过授权标头将令牌与每个请求一起发送回API,如下所示:

授权:基本e1d9753f-a508-46cc-a428-1787595d63e4

在服务器端,用户名/GUID组合将存储在服务器上,并带有过期日期和设备设置。这将允许跟踪用户登录的设备数量,并在Guid过期后使会话过期

这种方法听起来合理且安全吗?

一般的“使用令牌的身份验证”方法非常好,但您不应该尝试以与预期不同的方式进行基本身份验证(毕竟,它是一种已定义的标准)。您应该使用自己的头进行身份验证。您可以在此处找到对此类场景的非常好的描述:


您根本不需要创建自定义头或身份验证方案

Bearer
身份验证方案完全是为您的用例而设计的:

Authorization: Bearer e1d9753f-a508-46cc-a428-1787595d63e4
Basic
authentication必须如下所示:

Authorization: Basic base64EncodedUsernameAndPassword
其中
base64encodedusernamedpassword
等于以下各项的输出:

base_64_encode(username + ':' + raw_password)
如果尾随文本值不是上述精确算法,请不要使用
Basic

如果您只想在方案名称后加上您想要的任何值,请使用
Bearer
scheme,这就是它的用途

警告
虽然可以使用简单的GUID/UUID作为令牌,但这并不是真正的安全令牌。考虑使用A代替。JWT可以进行数字签名并分配TTL,这样只有服务器设置才能a)创建并验证其真实性,b)确保其使用时间不会超过允许的时间。虽然这可能适用于基于GUID存储的数据,但JWT方法不需要服务器状态—因此它的扩展性要好得多—并且实现了相同的功能。

换句话说,我可以对第一个登录请求使用基本身份验证,然后让客户机发送自定义头“X-Auth-Token:e1d9753f-a508-46cc-a428-1787595d63e4“对于每个请求?并且不要在自定义标头名称中使用X,这是不推荐的@tpeczek如果我们将guid令牌作为json对象而不是某个标头发送,并且在接收take in action参数而不是标头时,该怎么办?这种方法是否有任何问题?我问这个问题,因为在api中,android和ios客户端以及angular web都使用guid令牌。@Dragon如果我理解正确,我的问题是,对于不能包含内容的请求(例如GET),该怎么办。您将无法将令牌作为这些的有效负载的一部分进行传递。@tpeczek否我的意思是,如果我们在参数中传递令牌,即Get api/Product?token=abc。对于对象中的Post api/产品和令牌。在这两种情况下,我们不在头中传递令牌。很抱歉解释得不好。我认为对于最后的特定场景,jwt和guid都只是一个令牌,例如,假设我们没有在令牌中存储任何敏感信息,无论它是jwt还是guid令牌,那么jwt将提供什么额外的好处来代替guid令牌呢。