【发布时间】:2018-04-16 04:56:24
【问题描述】:
我有一个带有网络服务的网络应用程序,客户将使用我的网络应用程序注册他们的应用程序。
现在客户将拥有 SPA 或移动应用程序类型的应用程序,他们将从他们的应用程序中使用我的网络服务。
所以我将实施基于令牌的机制来保护对我的端点的访问。
1) 但是在这里我很困惑,我应该使用任何框架来生成访问令牌,或者我可以使用任何库来生成任何随机字符串,我将在响应中发送这些字符串。例如:
TokenId = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Replace("+", "_")
因此,在注册应用程序时,如果客户端已为其应用程序启用身份验证,则将验证用户,然后我将返回访问令牌并使用该用户 ID 将 accesstoken 保存在我的数据库中。
所以我的数据库表如下所示,用于存储经过验证的访问令牌:
Id(autogenerated) accesstoken userid clientid createdat expiresat
因此,在用户通过身份验证之后,如果用户现在想要访问任何受保护的资源,那么用户需要在随后的标头调用中传递此访问令牌。
因此,我将从标头获取访问令牌,然后针对该数据库验证该访问令牌,然后允许访问我的受保护资源,其他明智的用户将获得授权。
我见过很多与此相关的东西,所以基本上这是 oauth2,我想实现它。
我见过Openid connect(这个项目甚至不编译),它位于oauth2之上,用于身份验证,oauth2将用于授权。
但是在这里,因为我将访问令牌存储在我的数据库中,所以我对此表示怀疑:
2) 现在我是否需要 openconnectid(但这个项目甚至不编译)来验证访问令牌,或者因为我将访问令牌存储在我的数据库中,所以我不需要 openconnectid?
3) 我想实现 asp.net 身份,但我会收到动态数据库连接字符串,因为我已经看到 asp.net 身份主要适用于实体框架,我找不到任何可以使用 ado.net 的来源使用 SQL 查询验证用户名和密码。我知道我可以这样做:
按照here 的描述创建一个实现 IUser 的自定义用户类 定义实现
的自定义用户存储public class UserStoreService
: IUserStore<CustomUser>, IUserPasswordStore<CustomUser>
但我不会有这些信息,因为我没有固定的连接字符串。连接字符串再次存储在客户端注册的数据库中。
4) 我们为用户提供了一个固定端点,客户端可以通过该端点创建一个管理员,因此我将使用我的 RSA 算法进行密码散列,然后将其存储在数据库中。那么现在我需要使用 asp.net 身份吗?
5) 我已经看到很多基于令牌的实现的以下链接,但我没有得到他们在哪个部分验证 accesstoken 但现在因为我将 accesstoken 存储在我的数据库中,我需要使用以下任何实现?
http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/
http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/
6) 此外,如果对于任何客户端,如果客户端不希望对其各自的应用程序进行身份验证,那么我要做的是我将没有该用户名密码验证,但我将简单地生成 accesstoken,然后发送响应然后在随后的每个请求中,都会传递访问令牌以访问受保护的资源。您认为这有意义吗?
我从未见过任何将访问令牌存储在数据库中的示例,而将访问令牌存储在数据库中的问题是我每次都必须调用数据库以验证每个端点的访问令牌。
更新:
我的网络服务引擎的用例是:
1) 支持多客户端应用。
2) 以令牌管理的形式为每个客户端应用程序管理用户会话。因此,由于本文的大部分内容都将 accesstoken 存储在身份中,并且该身份在 [Authorize] 属性中进行了验证,其中还验证了 accesstoken 并基于该用户被允许访问受保护的资源。这是我到目前为止的理解。
那么,如果我还支持多个客户端应用程序的用户身份和存储用户上下文是一个好主意吗?
【问题讨论】:
-
有许多志愿编辑愿意帮助调整和改进帖子,但我们不是您的自动更正。你能帮忙吗?
-
我已经从计算机上发布了这个问题,所以有时我确实会错过撇号和其他一些错误(我猜),但我认为我的问题目的很容易理解和明确,但如果我做了,我仍然很抱歉哪里出错了。
-
如果您愿意,您可以查看已完成的修复in the question's revision history - 我数了 37 次修复 - 不仅仅是一两个。您的回复是否意味着您希望志愿者在您将来发布的每个帖子中修复您的错误?
-
好吧,您现在已经了解到社区确实关心这些事情,您可以询问Meta question about it if you wish to。如果你发帖,请告诉我,这样我也可以回复。请注意,当您在帖子中出错时,编辑通常会修复它们,因此如果您故意这样做,您就是在故意浪费某人的宝贵时间。不用说,这不是很好。
标签: c# asp.net-web-api oauth-2.0 asp.net-identity owin