我正在开发几个Web服务和一些客户端(Web应用程序,移动设备等),它们将通过HTTP与所述服务进行交互.我目前的工作项目是为产品设计身份验证和授权解决方案.我已决定利用外部身份提供商(如Facebook,Google,Microsoft,Twitter等)进行身份验证.
我正试图解决这个问题,"当我的服务器发出请求时,我怎么知道用户是谁以及我怎么能确定?".下面还有更多问题......
系统应使用基于令牌的身份验证(而不是cookie或基本身份验证).
我相信这是扩展多个客户端和服务器同时提供松散耦合的正确选择.
根据我对基于令牌的身份验证的阅读和理解,以下是我想象的工作流程.现在让我们在Facebook浏览器上关注Facebook.我的假设是其他外部身份提供者应该具有类似的能力,尽管我还没有确认.
请注意,截至撰写时,我的基础是Facebook登录版2.2
我想象对于后续的服务器请求会重复步骤5-9(当用户的访问令牌有效时 - 未过期,从FB端撤销,应用权限更改等)
这是一个帮助您完成这些步骤的图表.请理解这个系统不是单页面应用程序(SPA).提到的Web服务是基本上为客户端提供JSON数据的API端点; 它们不提供HTML/JS/CSS(Web客户端服务器除外).

首先,根据我的前言和要求,所描述的方法是否有任何明显的差距/陷阱?
是否正在向Facebook执行出站请求,以根据所需/推荐的客户端请求验证访问令牌(上面的步骤6-8)?
我至少知道,我必须验证来自客户端请求的访问令牌.但是,我不知道在第一次验证后进行后续验证的推荐方法.如果有典型的模式,我很想听听它们.据我所知,根据我的要求,他们可能依赖于应用程序; 但是,我只是不知道该寻找什么.一旦我有了基本想法,我就会进行尽职调查.
例如,可能的想法:
在第一次验证完成后散列访问令牌+ userId对,并将其存储在分布式缓存中(可由所有Web服务器访问),其到期时间等于访问令牌.根据客户端的后续请求,对访问令牌+ userId对进行散列并检查其是否存在于缓存中.如果存在,则请求被授权.否则,请访问Facebook图形API以确认访问令牌.我假设如果我使用HTTPS(我会这样),这个策略可能是可行的.但是,性能如何比较?
此StackOverflow问题中接受的答案建议在Facebook用户令牌的第一次验证完成后创建自定义访问令牌.然后,自定义令牌将被发送到客户端以用于后续请求.不过,我想知道这是否比上述解决方案更复杂.这需要实现我自己的身份提供者(我想避免的事情,因为我想首先使用外部身份提供者......).这个建议有什么好处吗?
是signedRequest字段存在于在上述(步骤提到#3的响应此处),相当于签名的请求参数这里在"游戏画布登录"流?
它们似乎被暗示为等同,因为前者在文档中与后者相关联.但是,我很惊讶在Web文档的"手动构建登录流程" 页面中没有提到游戏页面上提到的验证策略.
如果#3的答案为"是",那么解码签名的相同身份确认策略是否可以与服务器端预期使用的策略进行比较?
我不知道是否这可以利用,而不是把所述debug_token图形API的出站呼叫(步骤#6的上方),以确认访问令牌的建议这里:

当然,为了在服务器端进行比较,需要将签名的请求部分与请求一起发送到服务器(上面的步骤#5).除了在不牺牲安全性的情况下的可行性之外,我想知道性能与进行出站呼叫相比如何.
虽然我正处于这种状态,但在什么情况/出于何种目的,您是否会将用户的访问令牌持久存储到数据库中?我没有看到我需要这样做的场景,但是,我可能会忽视某些事情.我很好奇是一些常见的场景可能会引发一些想法.
谢谢!
security authentication facebook facebook-authentication facebook-access-token
注意,我已经阅读了新的路由功能作为WebApi 2.2的一部分,以允许继承路由.然而,这似乎并没有解决我的特定问题.它似乎解决了继承动作级别路由属性的问题,但没有解决在类级别定义的路由前缀. http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-22#ARI
我想做这样的事情:
[RoutePrefix("account")]
public abstract class AccountControllerBase : ControllerBase { }
[RoutePrefix("facebook")]
public class FacebookController : AccountControllerBase
{
[Route("foo")]
public async Task<string> GetAsync() { ... }
}
[RoutePrefix("google")]
public class GoogleController : AccountControllerBase
{
[Route("bar")]
public async Task<string> GetAsync() { ... }
}
Run Code Online (Sandbox Code Playgroud)
我希望account继承路由前缀,因此在定义Facebook和Google控制器时,我会获得路由:
~/account/facebook/foo
~/account/google/bar
Run Code Online (Sandbox Code Playgroud)
目前,在没有account基类部分的情况下定义路由.
我使用此Application Insights 入门指南来设置我的应用程序。我正在运行VS2017 version 15.5.7,我的应用程序正在使用AspNetCore 2.0.0.
当我从 Visual Studio 使用 IIS Express F5 调试我的应用程序时,我在调试器事件窗口中看到 Application Insights 事件。但是,相同的事件不会流向 Azure 中的 Application Insights;我已经配置了InstrumentationKey内部secrets.json,如下所示。我已经通过设置断点确认密钥已加载到我的应用程序配置中。
作为另一个调试数据点,我已经确认在 Azure Web 应用程序中运行时,事件确实成功流向 Application Insights。此测试使用完全相同的代码。InstrumentationKey但是,我没有从 secrets.json加载,而是将APPINSIGHTS_INSTRUMENTATIONKEY环境变量配置为具有密钥(通过ApplicationSettings门户中的 Web 应用程序窗格)。
我不知道为什么我的事件没有通过本地主机调试器流到 Application Insights,但它们在部署到 Web 应用程序时。
程序.cs
public static void Main( string[] args )
{
BuildWebHost( args ).Run();
}
public static IWebHost BuildWebHost( string[] args ) =>
WebHost.CreateDefaultBuilder( args )
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
Run Code Online (Sandbox Code Playgroud)
启动文件
var …Run Code Online (Sandbox Code Playgroud)