forked from DataObjects-NET/dataobjects-net
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathSecurityConfigurationReaders.cs
106 lines (89 loc) · 4.26 KB
/
SecurityConfigurationReaders.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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// Copyright (C) 2024 Xtensive LLC.
// This code is distributed under MIT license terms.
// See the License.txt file in the project root for more information.
using System;
using System.Linq;
using Microsoft.Extensions.Configuration;
using Xtensive.Core;
using Xtensive.Orm.Configuration;
namespace Xtensive.Orm.Security.Configuration
{
internal sealed class NamelessFormatSecurityConfigurationReader : SecurityConfigurationReader
{
protected override SecurityConfiguration ReadInternal(IConfigurationSection configuration)
{
try {
var configAsIs = configuration.Get<SecurityConfiguration>();
if (configAsIs != null && (configAsIs.AuthenticationServiceName ?? configAsIs.HashingServiceName) != null) {
configAsIs.HashingServiceName = string.IsNullOrEmpty(configAsIs.HashingServiceName)
? SecurityConfiguration.DefaultHashingServiceName
: configAsIs.HashingServiceName.ToLowerInvariant();
configAsIs.AuthenticationServiceName = string.IsNullOrEmpty(configAsIs.AuthenticationServiceName)
? SecurityConfiguration.DefaultAuthenticationServiceName
: (configAsIs.AuthenticationServiceName?.ToLowerInvariant());
return configAsIs;
}
}
catch {
return null;
}
var children = configuration.GetChildren();
return !children.Any()
? new SecurityConfiguration(true)
: null;
}
}
internal sealed class BasedOnNamesFormatSecurityConfigurationReader : SecurityConfigurationReader
{
private const string ServiceNameAttributeName = "name";
protected override SecurityConfiguration ReadInternal(IConfigurationSection configuration)
{
var hashingServiceSection = configuration.GetSection(SecurityConfiguration.HashingServiceElementName);
var authenticationServiceSection = configuration.GetSection(SecurityConfiguration.AuthenticationServiceElementName);
if (hashingServiceSection == null && authenticationServiceSection == null) {
return null;
}
var hashingServiceName = hashingServiceSection.GetSection(ServiceNameAttributeName)?.Value;
if (hashingServiceName == null) {
var children = hashingServiceSection.GetChildren().ToList();
if (children.Count > 0) {
hashingServiceName = children[0].GetSection(ServiceNameAttributeName).Value;
}
}
var authenticationServiceName = authenticationServiceSection.GetSection(ServiceNameAttributeName)?.Value;
if (authenticationServiceName == null) {
var children = authenticationServiceSection.GetChildren().ToList();
if (children.Count > 0) {
authenticationServiceName = children[0].GetSection(ServiceNameAttributeName).Value;
}
}
if ((hashingServiceName ?? authenticationServiceName) != null) {
var securityConfiguration = new SecurityConfiguration(true);
if (!string.IsNullOrEmpty(hashingServiceName)) {
securityConfiguration.HashingServiceName = hashingServiceName.ToLowerInvariant();
}
if (!string.IsNullOrEmpty(authenticationServiceName)) {
securityConfiguration.AuthenticationServiceName = authenticationServiceName.ToLowerInvariant();
}
return securityConfiguration;
}
return null;
}
}
internal abstract class SecurityConfigurationReader : IConfigurationSectionReader<SecurityConfiguration>
{
public SecurityConfiguration Read(IConfigurationSection configurationSection) => ReadInternal(configurationSection);
public SecurityConfiguration Read(IConfigurationSection configurationSection, string nameOfConfiguration) =>
throw new NotSupportedException();
public SecurityConfiguration Read(IConfigurationRoot configurationRoot) =>
Read(configurationRoot, SecurityConfiguration.DefaultSectionName);
public SecurityConfiguration Read(IConfigurationRoot configurationRoot, string sectionName)
{
var section = configurationRoot.GetSection(sectionName);
return ReadInternal(section);
}
public SecurityConfiguration Read(IConfigurationRoot configurationRoot, string sectionName, string nameOfConfiguration) =>
throw new NotSupportedException();
protected abstract SecurityConfiguration ReadInternal(IConfigurationSection section);
}
}