Repository navigation
Expand file tree
/
Copy pathAuthenticationServiceCollectionExtensions.cs
More file actions
120 lines (107 loc) · 4.83 KB
/
Copy pathAuthenticationServiceCollectionExtensions.cs
File metadata and controls
120 lines (107 loc) · 4.83 KB
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNetCore.Authentication2;
using Microsoft.Extensions.DependencyInjection.Extensions;
namespace Microsoft.Extensions.DependencyInjection
{
/// <summary>
/// Extension methods for setting up authentication services in an <see cref="IServiceCollection" />.
/// </summary>
public static class AuthenticationServiceCollectionExtensions
{
public static IServiceCollection AddAuthentication(this IServiceCollection services)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
services.AddSingleton<ISystemClock, SystemClock>();
services.AddDataProtection();
services.AddWebEncoders();
services.TryAddScoped<IAuthenticationService, DefaultAuthenticationService>();
services.TryAddSingleton<IClaimsTransformation, DefaultClaimsTransformation>(); // Can be replaced with scoped ones that use DbContext
services.TryAddScoped<SchemeHandlerCache>(); // Add interface for the shared instance cache?
services.TryAddSingleton<IAuthenticationSchemeProvider, DefaultAuthenticationSchemeProvider>();
return services;
}
public static IServiceCollection AddAuthentication(this IServiceCollection services, Action<AuthenticationOptions2> configureOptions) {
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
if (configureOptions == null)
{
throw new ArgumentNullException(nameof(configureOptions));
}
services.AddAuthentication();
services.Configure(configureOptions);
return services;
}
// REVIEW: rename to just AddScheme?
public static IServiceCollection AddSchemeHandler<TOptions, THandler>(this IServiceCollection services, string authenticationScheme, Action<TOptions> configureOptions)
where TOptions : AuthenticationSchemeOptions, new()
where THandler : AuthenticationSchemeHandler<TOptions>
{
services.AddAuthentication(o =>
{
o.AddScheme(authenticationScheme, b =>
{
b.HandlerType = typeof(THandler);
var options = new TOptions();
configureOptions?.Invoke(options);
// revisit the settings typing
options.Validate();
b.Settings["Options"] = options;
});
});
services.AddTransient<THandler>();
return services;
}
public static IServiceCollection AddSchemeHandler<TOptions, THandler>(this IServiceCollection services, string authenticationScheme, TOptions options)
where TOptions : AuthenticationSchemeOptions, new()
where THandler : AuthenticationSchemeHandler<TOptions>
{
services.AddAuthentication(o =>
{
o.AddScheme(authenticationScheme, b =>
{
b.HandlerType = typeof(THandler);
b.Settings["Options"] = options;
});
});
services.AddTransient<THandler>();
return services;
}
// REVIEW: rename to just ConfigureScheme?
/// <summary>
///
/// </summary>
/// <typeparam name="TOptions"></typeparam>
/// <param name="services"></param>
/// <param name="authenticationScheme"></param>
/// <param name="configureOptions"></param>
/// <returns></returns>
public static IServiceCollection ConfigureSchemeHandler<TOptions>(this IServiceCollection services, string authenticationScheme, Action<TOptions> configureOptions)
where TOptions : AuthenticationSchemeOptions, new()
{
services.Configure<AuthenticationOptions2>(o =>
{
if (o.SchemeMap.ContainsKey(authenticationScheme))
{
var options = o.SchemeMap[authenticationScheme].Settings["Options"] as TOptions;
if (options == null)
{
throw new InvalidOperationException("Unable to find options in authenticationScheme settings for: " + authenticationScheme);
}
configureOptions?.Invoke(options);
}
else
{
throw new InvalidOperationException("No scheme registered for " + authenticationScheme);
}
});
return services;
}
}
}