1

我最近在 Visual Studio 2012 中启动了一个 Web API 2 项目,使用 OWIN 中间件通过 OAuth2 对用户进行身份验证。我合并了本教程中概述的基于令牌的身份验证(基于令牌的身份验证) 。身份验证部分效果很好。我添加了一些测试 API 方法,并且我想为我的 API 文档连接 Swagger。我也让这部分工作,除了来自 Swagger 的 API 调用在授权时失败。

经过研究,我找到了Erik Dahl关于如何将 Swagger 连接到 OWIN 中间件的帖子。根据帖子配置我的 Swagger 后,我现在可以在 Swagger UI 上看到每个 API 方法旁边的身份验证按钮。但是,当尝试进行身份验证时,Swagger 中的身份验证是使用 GET 请求完成的。Web API 上的身份验证虽然要求它是 POST 请求。是否可以配置 Swagger 使身份验证请求成为 POST?如果不是,我是否应该允许我的 API 接受 GET 请求以进行令牌身份验证?完成这项工作的最佳方法是什么?

注意:请求仍然符合我的身份验证逻辑,但是 client_id 和 client_secret 没有在 GET 请求中传递,仅在 POST 请求中传递。

这是我的 Swagger 配置:

httpConfig
    .EnableSwagger(c =>
    {
        c.SingleApiVersion("v1", "Sample API");

        c.ApiKey("token")
            .Description("API Key Authentication")
            .Name("Bearer")
            .In("header");

        c.OAuth2("oauth2")
            .AuthorizationUrl("/oauth/token")
            .Flow("implicit")
            .Description("OAuth2 authentication")
            .Scopes(scopes =>
            {
                scopes.Add("sampleapi", "Sample API");
            });


        c.OperationFilter<AssignOAuth2SecurityRequirements>();
    })
    .EnableSwaggerUi(c =>
    {
        c.EnableOAuth2Support(
            clientId: "Sample_App",
            clientSecret: "xxxxx",
            realm: "test-realm",
            appName: "Swagger UI");
    });

这是我的 OAuth 配置:

app.CreatePerOwinContext<ApiClientRepo>(ApiClientRepo.Create);
app.CreatePerOwinContext<MeetingRegistrantRepo>(MeetingRegistrantRepo.Create);

OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
    //For Dev enviroment only (on production should be AllowInsecureHttp = false)
    AllowInsecureHttp = true,
    TokenEndpointPath = new PathString("/oauth/token"),
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
    Provider = new CustomOAuthProvider(),
    AccessTokenFormat = new CustomJwtFormat("http://localhost:51071"),
    RefreshTokenProvider = new SimpleRefreshTokenProvider()
};

// OAuth 2.0 Bearer Access Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);
4

1 回答 1

1

不,我不会为了满足 Swagger 的要求而将身份验证方法从 POST 更改为 GET。

我发现另一篇文章应该可以帮助你在这里做你想做的事:http: //danielwertheim.se/use-identityserver-in-swaggerui-to-consume-a-secured-asp-net-webapi/

以这种方式尝试它是值得的。不要忘记,从 POST 更改为 GET 意味着您不能再在请求正文中传递参数,而是必须在请求的 URL 中进行,这会使整个事情变得不安全。

是的,ClientID 和 ClientSecret 仍然是 Authorization Header 的一部分,但仍然不要对这样的东西敞开心扉。Swagger 不应该决定你的 API 的架构,所以不要去那里。

于 2016-06-30T10:14:30.157 回答