我想下面的架构(我已经决定了产品的名称在这个例子中):
一台服务器上的Web API 2应用程序的运行 http://api.prettypictures.com
另一台服务器上MVC 5客户端应用程序运行 http://www.webpics.com
我想www.webpics.com客户端应用程序使用漂亮的图片API来:
- 注册用户名和密码的新帐户
- 注册新帐户与Facebook /谷歌/ Twitter的/微软
- 登录
- 检索图片
上述所有作品,除了与Facebook,谷歌等注册外部账户
我不能制定出正确的流程,从API的独立客户端用户创建外部帐户。
我已经研究了认证流程提供最文件,如下所示:
我已阅读在OWIN新标识模型几乎一切我所能。
我已经研究在Visual Studio 2013年的SPA模板它演示了如何做的大部分我需要什么,但只有当客户端和API是同一台主机上; 如果我想多个客户端访问我的API,并能够让用户通过谷歌等,它不工作,据我可以告诉OWIN认证流程中断注册。
这是迄今为止流程:
- 用户浏览www.webpics.com/Login
- www.webpics.com调用api.prettypictures.com/Account/ExternalLogins(设置回去在www.webpics.com一个回调RETURNURL),并显示最终链接到用户
- 用户点击“谷歌”
- 浏览器重定向到api.prettypictures.com/Account/ExternalLogin与运营商等的名称
- API的ExternalLogin行动实例到google.com挑战
- 浏览器被重定向到google.com
- 用户输入自己的用户名和密码(在到google.com,如果他们尚未登录)
- google.com现在提出安全许可:“api.prettypictures.com”想访问你的电子邮件地址,姓名,妻子,孩子等这样行吗?
- 用户点击“是的”,并带回api.prettypictures.com/Account/ExternalLogin与谷歌已经设置cookie。
这是我卡住了。 什么是应该接下来会发生莫名其妙的客户端应用程序应通知用户已成功验证与google.com,给予一次性使用访问代码交换访问令牌以后。 客户端应用程序应该有机会,如果有必要,提示用户输入用户名与他们的google.com登入相关联。
我不知道如何促进这一点。
其实在这一点上,浏览器最终从谷歌回调后坐在api.prettypictures.com/Account/ExternalLogin端点。 该API签署在谷歌,但客户不知道该如何面对这一切。 我应该管该cookie回www.webpics.com?
在SPA的应用程序,它通过AJAX实现和google.com会返回一个标记为一URL片段,它所有的作品很好,因为这一切坐在一个域。 但是,这违背了很多具有“API”是多个客户端可以充分利用的地步。
救命!
更新:MSFT发布了自己的官方ID连接客户端中间件和我一起@manfredsteyer努力构建适应卡塔纳至OpenID的的OAuth2授权服务器连接: 因为我在一月份写这个帖子的事情发生了变化 。 这种组合在不需要任何自定义客户端的代码更容易和更强大的解决方案,并与标准的OAuth2 / ID连接的客户100%兼容。 我在一月份中提到的不同的步骤,现在可以通过短短几行来代替:
服务器:
app.UseOpenIdConnectServer(options =>
{
options.TokenEndpointPath = new PathString("/connect/token");
options.SigningCredentials.AddCertificate(certificate);
options.Provider = new CustomOpenIdConnectServerProvider();
});
客户:
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Authority = "http://localhost:55985/",
ClientId = "myClient",
ClientSecret = "secret_secret_secret",
RedirectUri = "http://localhost:56854/oidc"
});
你可以找到关于GitHub的库中的所有细节(和不同的样品):
https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server
https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/tree/dev/samples/Nancy
乔希,你肯定是在正确的轨道上,你的委托/联合认证的实施似乎还不错(我想你已经使用从预定义OWIN中间件Microsoft.Owin.Security.Facebook/Google/Twitter
)。
你需要做的就是创建自己的自定义的OAuth2授权服务器是什么。 你有足够的选项来实现这一点,但最简单的可能就是堵塞OAuthAuthorizationServerMiddleware
在OWIN启动类。 你会在找到它Microsoft.Owin.Security.OAuth
NuGet包。
而最好的做法是创建一个单独的项目(通常被称为“AuthorizationServer”),我个人更喜欢将它添加到我的“API项目”时,并不意味着它在多个API(这里使用,你必须将其插入该项目托管“api.prettypictures.com”)。
你会发现在武士刀库中一个伟大的例子:
https://katanaproject.codeplex.com/SourceControl/latest#tests/Katana.Sandbox.WebServer/Startup.cs
app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
{
AuthorizeEndpointPath = new PathString("/oauth2/authorize"),
TokenEndpointPath = new PathString("/oauth2/token"),
ApplicationCanDisplayErrors = true,
AllowInsecureHttp = true,
Provider = new OAuthAuthorizationServerProvider
{
OnValidateClientRedirectUri = ValidateClientRedirectUri,
OnValidateClientAuthentication = ValidateClientAuthentication,
OnGrantResourceOwnerCredentials = GrantResourceOwnerCredentials,
},
AuthorizationCodeProvider = new AuthenticationTokenProvider
{
OnCreate = CreateAuthenticationCode,
OnReceive = ReceiveAuthenticationCode,
},
RefreshTokenProvider = new AuthenticationTokenProvider
{
OnCreate = CreateRefreshToken,
OnReceive = ReceiveRefreshToken,
}
});
不要犹豫,浏览整个项目怎么看的授权同意书已经用简单的剃刀文件来实现。 如果你喜欢像ASP.NET MVC或NancyFX更高层次的框架,创建自己的AuthorizationController
控制器和Authorize
方式(请务必接受GET和POST),并使用属性路由来匹配您的OAuth2授权服务器定义的AuthorizeEndpointPath(即。 [Route("oauth2/authorize")]
我的样品,其中,我已经改变了在AuthorizeEndpointPath
使用oauth2/
作为路径碱)。
你需要做的另一件事是在你的web应用程序中加入OAuth2用户授权客户。 遗憾的是,在卡塔纳没有通用OAuth2用户端的支持,你就必须建立自己的。 我个人提交了一份提案,武士刀球队,但它已被拒绝。 但是,不要惊慌,这是相当容易做到:
将相应的文件从位于那里的Microsoft.Owin.Security.Google库复制: https://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Security.Google/GoogleOAuth2AuthenticationHandler.cs
你需要GoogleOAuth2AuthenticationHandler
, GoogleOAuth2AuthenticationMiddleware
, GoogleOAuth2AuthenticationOptions
, GoogleAuthenticationExtensions
(你必须删除对应谷歌的OpenID执行第2种方法), IGoogleOAuth2AuthenticationProvider
, GoogleOAuth2ReturnEndpointContext
, GoogleOAuth2AuthenticationProvider
, GoogleOAuth2AuthenticatedContext
和GoogleOAuth2ApplyRedirectContext
。 一旦你插入你的项目这些文件托管“webpics.com”,因此重命名和改变其授权和访问令牌端点URL中GoogleOAuth2AuthenticationHandler
来匹配你在你的OAuth2授权服务器定义的值。
然后,从改名/自定义添加使用方法GoogleAuthenticationExtensions
您OWIN启动类。 我建议使用AuthenticationMode.Active
让您的用户将被直接重定向到API的OAuth2授权端点。 因此,你应该禁止“api.prettypictures.com/Account/ExternalLogins”往返,让OAuth2用户端中间件改变401级的响应到客户端重定向到您的API。
祝好运。 如果你需要更多的信息,不要犹豫;)
文章来源: Registering Web API 2 external logins from multiple API clients with OWIN Identity