In .NetCore habe ich Folgendes getan:
Normales Setup:
Erstellen Sie in Ihrer appsettings.json einen Konfigurationsabschnitt für Ihre benutzerdefinierten Definitionen:
"IDP": [
{
"Server": "asdfsd",
"Authority": "asdfasd",
"Audience": "asdfadf"
},
{
"Server": "aaaaaa",
"Authority": "aaaaaa",
"Audience": "aaaa"
}
]
Erstellen Sie eine Klasse, um die Objekte zu modellieren:
public class IDP
{
public String Server { get; set; }
public String Authority { get; set; }
public String Audience { get; set; }
}
in Ihrem Startup -> ConfigureServices
services.Configure<List<IDP>>(Configuration.GetSection("IDP"));
Hinweis: Wenn Sie innerhalb Ihrer ConfigureServices-Methode sofort auf Ihre Liste zugreifen müssen, können Sie ...
var subSettings = Configuration.GetSection("IDP").Get<List<IDP>>();
Dann in Ihrem Controller so etwas:
Public class AccountController: Controller
{
private readonly IOptions<List<IDP>> _IDPs;
public AccountController(IOptions<List<Defined>> IDPs)
{
_IDPs = IDPs;
}
...
}
Nur als Beispiel habe ich es an anderer Stelle im obigen Controller wie folgt verwendet:
_IDPs.Value.ForEach(x => {
});
Edge Case
Für den Fall, dass Sie mehrere Konfigurationen benötigen, diese sich jedoch nicht in einem Array befinden können und Sie keine Ahnung haben, wie viele Untereinstellungen Sie gleichzeitig haben werden. Verwenden Sie die folgende Methode.
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"
}
}
Modell
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; }
}
Erstellen Sie eine Erweiterung für das Expando-Objekt
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);
foreach (PropertyInfo property in
targetObjectType.GetProperties(bindingFlags))
{
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")
{
var section = $"IDP:{idx.ToString()}";
services.AddProtectedWebApi(Configuration, section, scheme.Description);
}
idx++;
}