Dans .NetCore, c'est ce que j'ai fait :
Configuration normale :
Dans votre appsettings.json, créez une section de configuration pour vos définitions personnalisées :
"IDP": [
{
"Server": "asdfsd",
"Authority": "asdfasd",
"Audience": "asdfadf"
},
{
"Server": "aaaaaa",
"Authority": "aaaaaa",
"Audience": "aaaa"
}
]
Créez une classe pour modéliser les objets :
public class IDP
{
public String Server { get; set; }
public String Authority { get; set; }
public String Audience { get; set; }
}
dans votre Démarrage -> ConfigureServices
services.Configure<List<IDP>>(Configuration.GetSection("IDP"));
Remarque : si vous devez accéder immédiatement à votre liste dans votre méthode ConfigureServices vous pouvez utiliser...
var subSettings = Configuration.GetSection("IDP").Get<List<IDP>>();
Puis dans votre contrôleur quelque chose comme ceci :
Public class AccountController: Controller
{
private readonly IOptions<List<IDP>> _IDPs;
public AccountController(IOptions<List<Defined>> IDPs)
{
_IDPs = IDPs;
}
...
}
juste à titre d'exemple, je l'ai utilisé ailleurs dans le contrôleur ci-dessus comme ceci :
_IDPs.Value.ForEach(x => {
// do something with x
});
Cas limite
Dans le cas où vous avez besoin de plusieurs configurations mais qu'elles ne peuvent pas être dans un tableau et que vous n'avez aucune idée du nombre de sous-configurations que vous aurez à un moment donné. Utilisez la méthode suivante.
appsettings.json
"IDP": {
"0": {
"Description": "idp01_test",
"IDPServer": "https://intapi.somedomain.com/testing/idp01/v1.0",
"IDPClient": "someapi",
"Format": "IDP"
},
"1": {
"Description": "idpb2c_test",
"IDPServer": "https://intapi.somedomain.com/testing/idpb2c",
"IDPClient": "api1",
"Format": "IDP"
},
"2": {
"Description": "MyApp",
"Instance": "https://sts.windows.net/",
"ClientId": "https://somedomain.com/12345678-5191-1111-bcdf-782d958de2b3",
"Domain": "somedomain.com",
"TenantId": "87654321-a10f-499f-9b5f-6de6ef439787",
"Format": "AzureAD"
}
}
Modèle
public class IDP
{
public String Description { get; set; }
public String IDPServer { get; set; }
public String IDPClient { get; set; }
public String Format { get; set; }
public String Instance { get; set; }
public String ClientId { get; set; }
public String Domain { get; set; }
public String TenantId { get; set; }
}
Créer une extension pour l'objet Expando
public static class ExpandObjectExtension
{
public static TObject ToObject<TObject>(this IDictionary<string, object> someSource, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public)
where TObject : class, new()
{
Contract.Requires(someSource != null);
TObject targetObject = new TObject();
Type targetObjectType = typeof(TObject);
// Go through all bound target object type properties...
foreach (PropertyInfo property in
targetObjectType.GetProperties(bindingFlags))
{
// ...and check that both the target type property name and its type matches
// its counterpart in the ExpandoObject
if (someSource.ContainsKey(property.Name)
&& property.PropertyType == someSource[property.Name].GetType())
{
property.SetValue(targetObject, someSource[property.Name]);
}
}
return targetObject;
}
}
ConfigureServices
var subSettings = Configuration.GetSection("IDP").Get<List<ExpandoObject>>();
var idx = 0;
foreach (var pair in subSettings)
{
IDP scheme = ((ExpandoObject)pair).ToObject<IDP>();
if (scheme.Format == "AzureAD")
{
// this is why I couldn't use an array, AddProtecedWebApi requires a path to a config section
var section = $"IDP:{idx.ToString()}";
services.AddProtectedWebApi(Configuration, section, scheme.Description);
// ... do more stuff
}
idx++;
}
0 votes
Peut-être que ça marche weblog.west-wind.com/posts/2016/may/23/
0 votes
Peut-être. J'utilise une application console qui n'est pas asp.net mais je vais voir si je peux mettre la main sur la collection de services.
0 votes
Oui, cela fonctionne aussi dans les applications de la console. Ce n'est pas spécifique à asp.net
0 votes
Je pose la question uniquement parce que je reçois le message suivant :
Could not load file or assembly 'Microsoft.Extensions.Configuration.Binder, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified
0 votes
Vous pouvez également utiliser une classe DTO pour analyser la configuration.