更新:自从我在一月份写这篇文章以来,情况发生了变化:MSFT发布了他们的官方OpenID Connect客户端中间件,并且我与@manfredsteyer一起努力使Katana中内置的OAuth2授权服务器适应OpenID connect。这种组合可带来更轻松,更强大的解决方案,不需要任何自定义客户端代码,并且与标准OAuth2 / OpenID连接客户端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
Josh,您肯定走在正确的轨道上,您的委派/联合身份验证实现似乎还不错(我想您已经使用了来自的预定义OWIN中间件Microsoft.Owin.Security.Facebook/Google/Twitter
)。
您需要做的是创建自己的自定义OAuth2授权服务器。您可以通过多种选择来实现这一目标,但是最简单的选择可能是将其插入OAuthAuthorizationServerMiddleware
OWIN Startup类。您可以在Microsoft.Owin.Security.OAuth
Nuget包中找到它。
虽然最佳做法是创建一个单独的项目(通常称为“ AuthorizationServer”),但我个人更倾向于将其添加到我的“ API项目”中,而不是要跨多个API使用它(在这里,您必须将其插入在托管“ api.prettypictures.com”的项目中)。
您将在Katana存储库中找到一个很好的示例:
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,
}
});
请毫不犹豫地浏览整个项目,以查看如何使用简单的Razor文件实施授权同意书。如果你喜欢像ASP.NET MVC或NancyFX更高层次的框架,创建自己的AuthorizationController
控制器和Authorize
方法(请务必同时接受GET和POST)和使用属性路由到匹配的OAuth2授权服务器(即定义的AuthorizeEndpointPath。[Route("oauth2/authorize")]
在我的样品,在那里我已经改变了AuthorizeEndpointPath
在使用oauth2/
作为路径的基础)。
您需要做的另一件事是在您的Web应用程序中添加OAuth2授权客户端。不幸的是,Katana中没有通用的OAuth2客户端支持,因此您必须构建自己的客户端。我已经向Katana团队提交了一个提案,但遭到拒绝。但是不要惊慌,这很容易做到:
从位于此处的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授权服务器中定义的URL 。
然后,将重命名/自定义中的Use方法添加GoogleAuthenticationExtensions
到OWIN Startup类中。建议AuthenticationMode.Active
您使用,以便将您的用户直接重定向到您的API OAuth2授权端点。因此,您应该禁止“ api.prettypictures.com/Account/ExternalLogins”往返,并让OAuth2客户端中间件更改401响应以将客户端重定向到您的API。
祝好运。如果您需要更多信息,请不要犹豫;)