gpt4 book ai didi

identityserver4 - 使用内存中的 IdentityServer 进行集成测试

转载 作者:行者123 更新时间:2023-12-03 11:52:56 27 4
gpt4 key购买 nike

我有一个使用 IdentityServer4 进行 token 验证的 API。
我想使用内存中的 TestServer 对这个 API 进行单元测试。我想在内存中的 TestServer 中托管 IdentityServer。
我已经成功地从 IdentityServer 创建了一个 token 。
这是我走了多远,但我收到错误“无法从 http://localhost:54100/.well-known/openid-configuration 获取配置”
Api 使用具有不同策略的 [Authorize] 属性。这就是我想要测试的。
这可以做到吗,我做错了什么?
我曾尝试查看 IdentityServer4 的源代码,但没有遇到类似的集成测试场景。

protected IntegrationTestBase()
{
var startupAssembly = typeof(Startup).GetTypeInfo().Assembly;

_contentRoot = SolutionPathUtility.GetProjectPath(@"<my project path>", startupAssembly);
Configure(_contentRoot);
var orderApiServerBuilder = new WebHostBuilder()
.UseContentRoot(_contentRoot)
.ConfigureServices(InitializeServices)
.UseStartup<Startup>();
orderApiServerBuilder.Configure(ConfigureApp);
OrderApiTestServer = new TestServer(orderApiServerBuilder);

HttpClient = OrderApiTestServer.CreateClient();
}

private void InitializeServices(IServiceCollection services)
{
var cert = new X509Certificate2(Path.Combine(_contentRoot, "idsvr3test.pfx"), "idsrv3test");
services.AddIdentityServer(options =>
{
options.IssuerUri = "http://localhost:54100";
})
.AddInMemoryClients(Clients.Get())
.AddInMemoryScopes(Scopes.Get())
.AddInMemoryUsers(Users.Get())
.SetSigningCredential(cert);

services.AddAuthorization(options =>
{
options.AddPolicy(OrderApiConstants.StoreIdPolicyName, policy => policy.Requirements.Add(new StoreIdRequirement("storeId")));
});
services.AddSingleton<IPersistedGrantStore, InMemoryPersistedGrantStore>();
services.AddSingleton(_orderManagerMock.Object);
services.AddMvc();
}

private void ConfigureApp(IApplicationBuilder app)
{
app.UseIdentityServer();
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
var options = new IdentityServerAuthenticationOptions
{
Authority = _appsettings.IdentityServerAddress,
RequireHttpsMetadata = false,

ScopeName = _appsettings.IdentityServerScopeName,
AutomaticAuthenticate = false
};
app.UseIdentityServerAuthentication(options);
app.UseMvc();
}
在我的单元测试中:
private HttpMessageHandler _handler;
const string TokenEndpoint = "http://localhost/connect/token";
public Test()
{
_handler = OrderApiTestServer.CreateHandler();
}

[Fact]
public async Task LeTest()
{
var accessToken = await GetToken();
HttpClient.SetBearerToken(accessToken);

var httpResponseMessage = await HttpClient.GetAsync("stores/11/orders/asdf"); // Fails on this line

}

private async Task<string> GetToken()
{
var client = new TokenClient(TokenEndpoint, "client", "secret", innerHttpMessageHandler: _handler);

var response = await client.RequestClientCredentialsAsync("TheMOON.OrderApi");

return response.AccessToken;
}

最佳答案

我认为您可能需要根据您想要多少功能来为您的授权中间件制作一个假测试。所以基本上你想要一个中间件来完成授权中间件所做的一切,减去对发现文档的反向 channel 调用。

IdentityServer4.AccessTokenValidation 是两个中间件的包装器。 JwtBearerAuthentication中间件,以及 OAuth2IntrospectionAuthentication中间件。这两者都通过 http 获取发现文档以用于 token 验证。如果您想进行内存中自包含测试,这是一个问题。

如果你想解决这个问题,你可能需要制作一个 app.UseIdentityServerAuthentication 的假版本。这不会执行获取发现文档的外部调用。它只填充 HttpContext 主体,以便可以测试您的 [Authorize] 策略。

查看 IdentityServer4.AccessTokenValidation 的主要内容 here .并跟进看看 JwtBearer 中间件的外观 here

关于identityserver4 - 使用内存中的 IdentityServer 进行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39390339/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com