Oauth 2.0 在授权服务器中解耦自主机

Oauth 2.0 在授权服务器中解耦自主机,oauth-2.0,signalr,owin,self-hosting,dpapi,Oauth 2.0,Signalr,Owin,Self Hosting,Dpapi,我有一个自我托管的OWIN应用程序,配置为授权服务器和信号资源服务器 我的客户正在成功获取承载令牌,并在随后呼叫信号集线器时提供该令牌以供授权 我的下一步是解耦授权服务,以便它可以在自己的主机上运行。首先,我创建了一个单独的自托管应用程序,其中只包含授权服务代码。在我的开发机器上,它仍然是一个集所有功能于一身的解决方案,但授权服务和信号器资源托管在不同的进程中 身份验证流仍在正常工作。令牌正在访问我的资源服务器,但现在从信号器集线器获得401未经授权 在ASP.NETWebAPI中有很多解决此问

我有一个自我托管的OWIN应用程序,配置为授权服务器和信号资源服务器

我的客户正在成功获取承载令牌,并在随后呼叫信号集线器时提供该令牌以供授权

我的下一步是解耦授权服务,以便它可以在自己的主机上运行。首先,我创建了一个单独的自托管应用程序,其中只包含授权服务代码。在我的开发机器上,它仍然是一个集所有功能于一身的解决方案,但授权服务和信号器资源托管在不同的进程中

身份验证流仍在正常工作。令牌正在访问我的资源服务器,但现在从信号器集线器获得401未经授权

在ASP.NETWebAPI中有很多解决此问题的支持,在ASP.NETWebAPI中,您可以同步Web.config文件中的machine.config值。但这不是我的架构。作为HttpListener下的自托管应用程序运行时,默认情况下使用不同的加密(DPAPI)

关于在自托管体系结构中解决这个问题,似乎没有太多讨论。我的理论是,即使在同一台机器上的不同进程下,DPAPI解密也会失败,因此我得到了401

我试图弄清楚是否有一些最小的方法来解决这个问题,或者我是否必须完全重构,或者改用JWT

编辑:添加一些代码以帮助显示我的设置

public void ConfigureOAuth(IAppBuilder app)
{
    OAuthAuthorizationServerOptions OAuthServerOptions = new       OAuthAuthorizationServerOptions()
   {
        AllowInsecureHttp = false,
        TokenEndpointPath = new PathString("/account/login"),
        AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
        Provider = new SimpleAuthorizationServerProvider()
    };
    app.UseOAuthAuthorizationServer(OAuthServerOptions);
} 

public void ConfigureOAuth(IAppBuilder app)
{
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
        {
            Provider = new ApplicationOAuthBearerAuthenticationProvider(),
        });
}   

发布我自己的解决方案,希望能帮助其他人

我确实决定实现JWT解决方案,而不是使用默认方案。无论如何,我认为这是更好的体系结构,将令牌加密与操作系统分离。我使用了这个教程

关键在于创建自定义OAuthAuthorizationServerProvider和ISecureDataFormat以加密令牌,如教程所示。这只是显示OWIN配置

    public void ConfigureOAuth(IAppBuilder app)
    {
        OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = false,
            TokenEndpointPath = new PathString("/account/login"),
            AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
            Provider = new JwtAuthorizationServerProvider(),
            AccessTokenFormat = new CustomJwtFormat("https://foo.test.com")
        };
        app.UseOAuthAuthorizationServer(OAuthServerOptions);
    }
您可能面临的另一个问题是将令牌获取给signar,其中设置授权头并不像您想象的那样简单。碰巧,本教程中基于cookie的实现也与JWT配合得很好

这里是OWIN配置示例

    public void ConfigureOAuth(IAppBuilder app)
    {
        //app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
        //{
        //    Provider = new ApplicationOAuthBearerAuthenticationProvider()
        //});

        var issuer = "https://foo.test.com";
        var audience = "client_id";
        var secret = TextEncodings.Base64Url.Decode("ABCDEF");

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

    }

FWW,考虑自托管OWIN授权服务器使用DPAPI保护,但ASP.NET Apple默认为MealEKIKE数据保护。 如果需要使这两个提供者协作,可以在OWIN配置中指定如下提供程序:

app.SetDataProtectionProvider(new DpapiDataProtectionProvider("myApp"));
只需确保将其添加到IAppBuilder的两种配置方法中(两个项目)