具有AllowInsecureHttp = false的令牌端点仍然接受http请求

时间:2017-06-17 12:13:06

标签: c# asp.net asp.net-web-api jwt access-token

希望任何人都可以帮助我解决以下非常令人沮丧的问题。

我有.NET WebApi,我使用jwt身份验证进行保护。在设置OAuthAuthorizationServerOptions - 对象时,我将令牌终点的属性AllowInsecureHttp设置为false。在IISExpress上本地运行我的API并使用Postman进行测试就像魅力一样。如果我将属性设置为true并在我的终点上请求令牌,那么如果我将其设置为false,我会按预期获得404。但是,当我将API发布到我的生产环境(Windows 2012 / IIS8)并将属性设置为false时,我可以通过https http获取令牌。它似乎没有听取财产。

我在一个只有一个https绑定的域下运行API作为具有别名Api的应用程序。我为我的API使用以下帮助器基类:

public class BaseWebApi<TDerivedOAuthProvider> where TDerivedOAuthProvider : BaseOAuthProvider, new()
{
    public BaseWebApi(IAppBuilder app)
    {
        HttpConfiguration config = new HttpConfiguration();
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(DefaultAuthenticationTypes.ExternalBearer));

        ConfigureOAuth(app);

        WebApiConfig.Register(config);
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        app.UseWebApi(config);
    }

    private static void ConfigureOAuth(IAppBuilder app)
    {
        var allowInsecureHttp = Convert.ToBoolean(ConfigurationManager.AppSettings["jwt::allowInsecureHttp"].ToString());
        var issuer = ConfigurationManager.AppSettings["jwt::issuer"].ToString();
        var secret = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["jwt::secret"].ToString());
        var clients = ConfigurationManager.AppSettings["jwt::clients"].ToString().Split(new char[] { ',' });

        OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = allowInsecureHttp,
            AuthenticationType = DefaultAuthenticationTypes.ExternalBearer,
            TokenEndpointPath = new PathString("/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(10),
            Provider = new TDerivedOAuthProvider(),
            RefreshTokenProvider = new BaseRefreshTokenProvider(),
            AccessTokenFormat = new BaseJwtFormat(issuer),
        };

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

        // Api controllers with an [Authorize] attribute will be validated with JWT
        app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ExternalBearer,
            AuthenticationMode = AuthenticationMode.Active,
            AllowedAudiences = clients,
            IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
            {
                new SymmetricKeyIssuerSecurityTokenProvider(issuer, secret)
            }
        });
    }

}

从配置文件中填充变量allowInsecureHttpissuersecretclients。将allowInsecureHttp硬编码设置为falsetrue的值不会改变任何内容。然后,我的实际API实例化了这个基类,它(在实际的API函数旁边)还提供了一个CustomOAuthProvider类来处理这个特定API的凭证检查的实际实现:

[assembly: OwinStartup(typeof(MyCustomAPI.Startup))]
namespace MyCustomAPI.API
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            BaseWebApi<CustomOAuthProvider> webApi = new BaseWebApi<CustomOAuthProvider>(app);
        }
    }
}

希望任何人都能指出我正确的方向。抛开这个问题,API本身运行得很完美,但我真的想在我的生产代币上强制使用SSL。

干杯, 奈奎斯特

1 个答案:

答案 0 :(得分:0)

对于任何遇到同样问题的人。最终想出来了。像魅力一样工作,但我配置虚拟应用程序的域上的HSTS策略将所有http邮递员流量自动重定向到https。在没有SSL的简单域上安装应用程序,并且在该域上完全实施了SSL。 叹息 :)