如何使用 OWIN 中间件在 Web Api 中实现 OAuth2 Authorization_Code 流?

How do I implement an OAuth2 Authorization_Code Flow in Web Api using OWIN Middleware?

我正在尝试创建一个支持 OAuth 的应用程序的简单概念证明,但我卡在了授权代码实现上。我读到的所有地方似乎都以这样或那样的方式进行,从未真正使用过授权代码流。我一直在使用以下资源获取信息:

我已经设置了 web api 并使用自定义 OAuthAuthorizationServerProvider 来接受刷新令牌的密码授权类型以及将刷新令牌交换为访问令牌的能力。这工作得很好,但我想设置一个场景,我将浏览器重定向到服务器以授权并使用授权代码重定向回客户端。然后我希望客户端将授权代码发送到令牌端点以获取刷新令牌

在网络服务器应用程序下的第二个 link 中,我试图让我的网络 api 应用程序从 http://127.0.0.1/auth?response_type=code&client_id=123&redirect_uri=http://validredirect.com&scope=access 等请求中显示授权代码,但我继续收到 404。

我对owin的配置如下:

var databaseContext = new AdnsfContext();

WebApp.Start(
    new StartOptions("http://127.0.0.1:7000"),
    appBuilder =>
    {
        var httpConfig = new HttpConfiguration();
        httpConfig.MapHttpAttributeRoutes();
        httpConfig.SuppressDefaultHostAuthentication();
        httpConfig.Filters.Add(new HostAuthenticationFilter("Bearer"));

        appBuilder
            .UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
                {
                    AllowInsecureHttp = true,
                    ApplicationCanDisplayErrors = true,
                    AuthorizeEndpointPath = new PathString("/auth"),
                    TokenEndpointPath = new PathString("/token"),
                    AuthorizationCodeExpireTimeSpan = TimeSpan.FromMinutes(1),
                    AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(1),
                    Provider = new AuthServerProvider(),
                    AuthorizationCodeProvider = new AuthorizationCodeProvider(),
                    RefreshTokenProvider = new RefreshTokenProvider(),
                })
            .UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
                {
                    AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
                    AuthenticationType = "Bearer",
                })
            .UseCors(CorsOptions.AllowAll)
            .UseWebApi(httpConfig);
    });

我为启用授权端点而添加的部分是身份验证服务器选项的属性:

AuthorizeEndpointPath = new PathString("/auth"),
AuthorizationCodeExpireTimeSpan = TimeSpan.FromMinutes(1),
AuthorizationCodeProvider = new AuthorizationCodeProvider(),

我的 AuthorizationCodeProvider 实现中的覆盖抛出了未实现的异常,但它目前甚至没有命中代码中设置的任何断点。需要注意的一件事是,当我使用 postman 访问 auth 端点时,我会为 HTTPAPI/2.0 返回服务器 header,这与该端点上根本没有任何内容的情况不同,这意味着我一定是错误地发送了请求。任何人都可以看到我的设置有问题吗?在此先感谢,我知道这显然是我对 OWIN 和 OAuth 的理解失败。

看看IdentityServer。它基于欧文。 还有 samples repository 在那里你可以找到很多使用 selfdeployed and\or 第 3 方身份提供者的例子。

我认为this one这个例子最适合你。

Katana 内置的 OAuth2 授权服务器需要注意的一件事是它透明:您必须提供自己的 /auth 端点(例如使用 MVC 或 Nancy)或直接提供在 OAuthAuthorizationServerProvider.AuthorizationEndpoint

中填写您的同意书

您可以查看 https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/tree/dev/samples/Mvc 以获得完整示例。它不使用 Katana 中内置的 OAuth2 授权服务器,而是使用针对 OpenID Connect 的更精细的分支,但您应该明白这一点。