我有一个自托管的OWIN应用程序,配置为授权服务器和信号资源服务器。
我的客户成功获取了不记名令牌,并在后续对signalR集线器的调用中提供授权。
我的下一步是将授权服务解耦,以便它可以在自己的主机上运行。为了开始,我创建了一个单独的自托管应用程序,它只包含授权服务代码。它仍然在我的开发机器上的一个解决方案中,但授权服务和signalR资源托管在不同的进程中。
身份验证流程仍在正常运行。令牌到达我的资源服务器,但现在从signalR集线器获得401未授权。
在ASP.Net Web API中有很多支持来解决这个问题,你可以在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(),
});
}
答案 0 :(得分:3)
发布我自己的解决方案,希望能帮助其他人。
我确实决定实施JWT解决方案,而不是使用默认解决方案。我认为这是更好的架构,将令牌加密与操作系统分离。我使用了本教程http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/
关键点是创建自定义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);
}
您可能面临的另一个问题是将令牌发送到SignalR,其中设置Authorization标头并不像您想象的那样直截了当。实际上,本教程中基于cookie的实现也与JWT完美配合! http://blog.marcinbudny.com/2014/05/authentication-with-signalr-and-oauth.html#.VmWgMXarSCd
这里再次是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()
});
}
答案 1 :(得分:0)
FWIW,请考虑自托管的OWIN授权服务器使用DPAPI保护,但是ASP.NET应用程序默认使用MachineKey数据保护。
如果您需要使这两个合作,可以在OWIN配置中指定一个提供者,如下所示:
app.SetDataProtectionProvider(new DpapiDataProtectionProvider("myApp"));
只需确保将其添加到IAppBuilder的两个配置方法中(两个项目)
HTH