ApiServiceCollectionExtensions.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using Emby.Server.Implementations;
  2. using Jellyfin.Api.Auth;
  3. using Jellyfin.Api.Auth.FirstTimeSetupOrElevatedPolicy;
  4. using Jellyfin.Api.Auth.RequiresElevationPolicy;
  5. using Jellyfin.Api.Controllers;
  6. using Microsoft.AspNetCore.Authentication;
  7. using Microsoft.AspNetCore.Authorization;
  8. using Microsoft.AspNetCore.Mvc;
  9. using Microsoft.AspNetCore.Mvc.Authorization;
  10. using Microsoft.Extensions.DependencyInjection;
  11. using Microsoft.OpenApi.Models;
  12. namespace Jellyfin.Api.Extensions
  13. {
  14. public static class ApiServiceCollectionExtensions
  15. {
  16. public static IServiceCollection AddJellyfinApiAuthorization(this IServiceCollection serviceCollection)
  17. {
  18. serviceCollection.AddSingleton<IAuthorizationHandler, FirstTimeSetupOrElevatedHandler>();
  19. serviceCollection.AddSingleton<IAuthorizationHandler, RequiresElevationHandler>();
  20. return serviceCollection.AddAuthorizationCore(options =>
  21. {
  22. options.AddPolicy(
  23. "RequiresElevation",
  24. policy =>
  25. {
  26. policy.AddAuthenticationSchemes("CustomAuthentication");
  27. policy.AddRequirements(new RequiresElevationRequirement());
  28. });
  29. options.AddPolicy(
  30. "FirstTimeSetupOrElevated",
  31. policy =>
  32. {
  33. policy.AddAuthenticationSchemes("CustomAuthentication");
  34. policy.AddRequirements(new FirstTimeSetupOrElevatedRequirement());
  35. });
  36. });
  37. }
  38. public static AuthenticationBuilder AddCustomAuthentication(this IServiceCollection serviceCollection)
  39. {
  40. return serviceCollection.AddAuthentication("CustomAuthentication")
  41. .AddScheme<AuthenticationSchemeOptions, CustomAuthenticationHandler>("CustomAuthentication", null);
  42. }
  43. public static IMvcBuilder AddJellyfinApi(this IServiceCollection serviceCollection, string baseUrl)
  44. {
  45. return serviceCollection.AddMvc(opts =>
  46. {
  47. var policy = new AuthorizationPolicyBuilder()
  48. .RequireAuthenticatedUser()
  49. .Build();
  50. opts.Filters.Add(new AuthorizeFilter(policy));
  51. opts.EnableEndpointRouting = false;
  52. opts.UseGeneralRoutePrefix(baseUrl);
  53. })
  54. .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
  55. // Clear app parts to avoid other assemblies being picked up
  56. .ConfigureApplicationPartManager(a => a.ApplicationParts.Clear())
  57. .AddApplicationPart(typeof(StartupController).Assembly)
  58. .AddControllersAsServices();
  59. }
  60. public static IServiceCollection AddJellyfinApiSwagger(this IServiceCollection serviceCollection)
  61. {
  62. return serviceCollection.AddSwaggerGen(c =>
  63. {
  64. c.SwaggerDoc("v1", new OpenApiInfo { Title = "Jellyfin API", Version = "v1" });
  65. });
  66. }
  67. }
  68. }