【问题标题】:How do I implement an OAuth2 Authorization_Code Flow in Web Api using OWIN Middleware?如何使用 OWIN 中间件在 Web Api 中实现 OAuth2 Authorization_Code Flow?
【发布时间】:2015-02-26 18:27:00
【问题描述】:

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

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

在 Web 服务器应用程序下的第二个链接中,我试图让我的 Web 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 实现中的覆盖抛出未实现的异常,但它目前甚至没有遇到代码中设置的任何断点。需要注意的一件事是,当我使用邮递员访问 auth 端点时,我会返回 HTTPAPI/2.0 的服务器标头,这与该端点处根本没有出现任何东西不同,这意味着我必须发送请求错误地。谁能看到我的设置有问题?在此先感谢,我知道这显然是我对 OWIN 和 OAuth 的理解失败。

【问题讨论】:

    标签: c# asp.net-web-api oauth-2.0 owin


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      看看IdentityServer。它基于欧文。 还有samples repository,您可以在其中找到很多使用自部署和\或第 3 方身份提供者的示例。

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

      【讨论】:

      • IdentityServer 是一个极好的资源。连同我最初链接的原始 oauth2 spce、IdentityServer 和示例授权服务器,我能够弄清楚。
      • @JoshuaBelden 你能发布你的最终解决方案作为答案吗?或者至少是其中有意义的部分?
      • IdentityServer 让我很困惑,这会取代 OWIN 和本机实现的令牌和授权服务器吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 2014-08-29
      • 2015-04-23
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多