-
Notifications
You must be signed in to change notification settings - Fork 116
/
Copy pathServiceCollectionExtensions.cs
84 lines (71 loc) · 3.77 KB
/
ServiceCollectionExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Copyright (c) MASA Stack All rights reserved.
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
// ReSharper disable once CheckNamespace
namespace Microsoft.Extensions.DependencyInjection;
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddAuthClient(this IServiceCollection services, IConfiguration configuration, string? authServiceBaseAddress = null)
{
var redisOptions = configuration.GetSection("$public.RedisConfig").Get<RedisConfigurationOptions>();
authServiceBaseAddress ??= configuration.GetValue<string>("$public.AppSettings:AuthClient:Url");
services.AddAuthClient(authServiceBaseAddress, redisOptions);
return services;
}
public static IServiceCollection AddAuthClient(this IServiceCollection services, string authServiceBaseAddress, RedisConfigurationOptions redisOptions)
{
ArgumentNullException.ThrowIfNull(authServiceBaseAddress, nameof(authServiceBaseAddress));
return services.AddAuthClient(callerOptions =>
{
callerOptions.UseHttpClient(DEFAULT_CLIENT_NAME, builder =>
{
builder.Configure = opt => opt.BaseAddress = new Uri(authServiceBaseAddress);
})
.AddHttpMessageHandler<HttpEnvironmentDelegatingHandler>();
callerOptions.DisableAutoRegistration = true;
}, redisOptions);
}
public static IServiceCollection AddAuthClient(this IServiceCollection services, Action<CallerOptions> callerOptions, RedisConfigurationOptions redisOptions)
{
ArgumentNullException.ThrowIfNull(callerOptions, nameof(callerOptions));
if (services.All(service => service.ServiceType != typeof(IMultiEnvironmentUserContext)))
throw new Exception("Please add IMultiEnvironmentUserContext first.");
services.AddHttpContextAccessor();
services.TryAddScoped<IEnvironmentProvider, EnvironmentProvider>();
services.AddScoped<HttpEnvironmentDelegatingHandler>();
services.AddCaller(callerOptions);
services.AddAuthClientMultilevelCache(redisOptions);
services.AddSingleton<IThirdPartyIdpCacheService, ThirdPartyIdpCacheService>();
services.AddSingleton<ISsoClient, SsoClient>();
services.AddScoped<IAuthClient>(serviceProvider =>
{
var tokenProvider = serviceProvider.GetService<TokenProvider>();
var userContext = serviceProvider.GetRequiredService<IMultiEnvironmentUserContext>();
var callProvider = serviceProvider.GetRequiredService<ICallerFactory>().Create(DEFAULT_CLIENT_NAME);
if (tokenProvider != null)
{
callProvider.ConfigRequestMessage(httpRequestMessage =>
{
httpRequestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", tokenProvider.AccessToken);
});
}
var authClient = new AuthClient(callProvider, userContext);
return authClient;
});
MasaApp.TrySetServiceCollection(services);
return services;
}
public static IServiceCollection AddAuthClientMultilevelCache(this IServiceCollection services, RedisConfigurationOptions redisOptions)
{
services.AddMultilevelCache(
DEFAULT_CLIENT_NAME,
distributedCacheOptions => distributedCacheOptions.UseStackExchangeRedisCache(redisOptions),
multilevelCacheOptions =>
{
multilevelCacheOptions.SubscribeKeyType = SubscribeKeyType.SpecificPrefix;
multilevelCacheOptions.SubscribeKeyPrefix = DEFAULT_SUBSCRIBE_KEY_PREFIX;
}
);
services.AddSingleton<AuthClientMultilevelCacheProvider>();
return services;
}
}