You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
3.3 KiB

3 weeks ago
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder.Extensions;
using Microsoft.AspNetCore.Hosting;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using ReZero.DependencyInjection;
using ReZero.SuperAPI;
using System;
using System.Linq;
using System.Text;
namespace ReZero
{
public static partial class ReZeroServiceCollectionExtensions
{
/// <summary>
/// Adds ReZero services to the specified <see cref="IServiceCollection"/>.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection"/> to add the services to.</param>
/// <param name="options">The <see cref="ReZeroOptions"/> to configure the services.</param>
/// <returns>The modified <see cref="IServiceCollection"/>.</returns>
public static IServiceCollection AddReZeroServices(this IServiceCollection services, ReZeroOptions options)
{
ServiceLocator.Services = services;
services.AddHttpContextAccessor();
SuperAPIModule.Init(services, options);
AddDependencyInjection(options, options.SuperApiOptions);
DependencyInjectionModule.Init(services, options);
JwtInit(services, options);
return services;
}
private static void JwtInit(IServiceCollection services, ReZeroOptions options)
{
var key = options.SuperApiOptions.InterfaceOptions?.Jwt?.Secret + "";
if (string.IsNullOrEmpty(key)|| options.SuperApiOptions.InterfaceOptions?.Jwt?.Enable!=true)
{
return;
}
var keyBytes = Encoding.ASCII.GetBytes(key);
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateAudience = false,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(keyBytes)
};
});
}
public static IServiceCollection AddReZeroServices(this IServiceCollection services, Action<SuperAPIOptions> superAPIOptions)
{
var options = new ReZeroOptions();
ServiceLocator.Services = services;
superAPIOptions(options.SuperApiOptions);
return services.AddReZeroServices(options);
}
internal static void AddDependencyInjection(ReZeroOptions options, SuperAPIOptions superAPIOptions)
{
if (options.DependencyInjectionOptions?.Assemblies?.Any()!=true)
{
if (options.DependencyInjectionOptions == null)
{
options.DependencyInjectionOptions = new DependencyInjection.DependencyInjectionOptions();
}
options.DependencyInjectionOptions!.Assemblies = superAPIOptions?.DependencyInjectionOptions?.Assemblies;
}
}
}
}