1

我对网络开发相当陌生,所以如果我的术语有点不对,请原谅我。

我创建了一个 ASP.Net Web API,对于 API 上的某些方法,我需要一种方法来判断用户是否经过身份验证才能进行此类调用。例如,在某些方法上,我需要告诉正在拨打电话的用户的用户 ID。

我已经阅读了一些有关 AllowAnonymous 和 Authorize 属性(System.Web.Http.AuthorizeAttribute 和 System.Web.Http.AllowAnonymousAttribute)的内容。从我所做的阅读来看,对于 REST api,它确实应该使用 System.Web.Http.AuthorizeAttribute,而不是 Mvc (如此处所述:http ://www.asp.net/web-api/overview /security/authentication-and-authorization-in-aspnet-web-api#auth3)。我已经获得了具有适当属性的控制器和方法,因此控制器标有 [Authorize] 属性,并且任何公开可用的方法都标有 [AllowAnonymous]。我可以通过调用一个公开可用的方法来验证它是否有效,并且调用一个 [Authorize] 方法并且我得到一个 401 响应。

我目前已经连接到 WorldDomination 包以与第三方进行身份验证(https://github.com/PureKrome/WorldDomination.Web.Authentication)。这似乎是使用 Twitter、Facebook、Google 等进行身份验证的最简单方法。其工作原理是网站用户(使用 Web API)点击登录链接(通过 Twitter、Google、Facebook、 ETC。)。然后他们被带到一个通常的登录页面,看起来像这样(在这个例子中,它使用的是 Twitter):

常规登录页面

如果用户允许访问,则在有权访问 HttpContextBase 的服务器上调用一个方法,以及由第 3 方返回的用户数据(包括提供者名称、访问令牌、用户名、用户 id、 ETC。)。同样,如果用户取消或不允许权限,则会调用类似的函数。在成功函数的这一点上,我将第 3 方用户与我自己的内部用户 id 相关联,然后我需要在各种其他 API 调用中使用它(例如:创建对象需要用户 id 才能知道是谁创建的它)。

在这一点上,我有点卡住了。据我了解,为了对 Web API 进行经过身份验证的调用,我需要向它传递一个用户名:密码,在请求标头中编码为 64 位字符串。问题是,我没有存储用户名/密码(我也不想存储密码!)。

我究竟应该为我的“用户名:密码”使用什么,以及如何将它存储在客户端上以便它可以用于后续调用?我可以使用我自己的内部用户 ID 作为用户名,使用访问令牌(从第三方授予)作为密码,还是密码应该是用户每次通过第三方登录时创建的随机生成的 Guid?该站点最终将通过带有证书的 Https 运行。理想情况下,我想避免用户每次访问该站点时都必须登录。

我想与此同时,我可以使用标准表单身份验证,它使用客户端 cookie 来存储详细信息,但我最终需要知道如何在没有客户端 cookie 的情况下进行身份验证,因为我试图保持API 可访问多个平台(包括移动设备上的应用程序)。根据我有限的理解,其中一些平台不一定使用 cookie,并且需要使用每个调用中包含的标准 http 身份验证详细信息对事物进行身份验证。

4

0 回答 0