Einleitung
Die API wird via .net Dependency-Injection konfiguriert. Abhängig von der OpenId-Client-Konfiguration und dem gewünschten Authentifizierungsverfahren kann die Konfiguration anders aussehen.
Basis Optionen
ApiBaseUri
Die URl unter welcher die API erreichbar ist, z.B: https://localhost:8000/apiv2
ExplodeFlatChainProperties
Default: true
Definiert ob Property-Chains als verschachtelte Objekte oder einfache objekte zurückgegeben werden.
Beispiel: /servicedmcore/CoreIdentity/2/?fields=Id,Nachname,CoreIdentityType.Id
ExplodeFlatChainProperties = true | ExplodeFlatChainProperties = false |
---|---|
{ "ci_family_name": { "was_access_denied": false, "value": "Testikus" }, "id": 20, "core_identity_type": { "id": { "was_access_denied": false, "value": 1 } } } | { "ci_family_name": { "was_access_denied": false, "value": "Testikus" }, "core_identity_type.id": { "was_access_denied": false, "value": 1 }, "id": 20 } |
AccessDeniedReplacementString
Definiert ob die AccessDeniedHandler-Objekte ersetzt werden sollen. Wird die Option verwendet wird anstelle der AccessDeniedHandler-Objekte nur der Wert der Value-Property zusück gegeben. Sollte eine Zugriffsverweigerung vorliegen wird anstelle des Wertes der ReplacementString zurückgegeben.
Diese Option ist nicht Typen-sicher, da im Fall einer Zugriffsverweigerung immer ein String zurückgegeben wird, unabhängig vom ursprünglichen Type der Property
Beispiel: /servicedmcore/CoreIdentity/2/?fields=Id,Nachname,Language
AccessDeniedReplacementString=">Denied<" | |
---|---|
{ "ci_family_name": { "was_access_denied": true, "value": null }, "id": 20, "core_identity_type": { "id": { "was_access_denied": false, "value": 1 } } } | { "ci_family_name": ">Denied<", "id": 20, "core_identity_type": { "id": 1 } } |
.NET Core Konfiguration
Benötigte Assemblies
iTsense.Moving.Common.NetStandard
iTsense.Moving.ApiV2.Common
iTsense.Moving.ApiV2.Client
iTsense.Moving.ApiV2.Client.NetCore
Beispielkonfiguration mit Authentifizierung via HTTP-Userkontext
public void ConfigureServices(IServiceCollection services) { services.AddApiV2ClientWithHttpContextAuthentication(o => { o.ApiBaseUri = new Uri("https://localhost:8000/apiv2"); //o.ExplodeFlatChainProperties = false; //o.AccessDeniedReplacementString = ">>AccessDenied<<"; }); services.AddOpenIdConnectCookieAuthentication<IApiV2Client>(options => { options.Authority = "https://coslogin.local:5000"; options.RequireHttpsMetadata = false; // dev only options.ClientId = "[OpenID Client Id]"; options.ClientSecret = "[OpenID Client Secret]"; options.ResponseType = "code"; options.ResponseMode = "form_post"; options.Scope.Add("roles"); options.Scope.Add("profile"); options.Scope.Add("offline_access"); options.SaveTokens = true; options.GetClaimsFromUserInfoEndpoint = true; options.CallbackPath = "/signin-oidc"; options.UsePkce = true; }); }
Beispielkonfiguration mit Authentifizierung via statischem API-Benutzer
public void ConfigureServices(IServiceCollection services) { services.AddApiV2ClientWithOpenIdPasswordFlow(o => { o.Authority = new Uri("https://coslogin.local:5000"); o.ApiBaseUri = new Uri("https://localhost:8000/apiv2"); o.ClientId = "[OpenID Client Id]"; o.ClientSecret = "[OpenID Client Secret]"; o.Username = "[OpenID User Name]"; o.Password = "[OpenID User Password]"; //o.ExplodeFlatChainProperties = false; //o.AccessDeniedReplacementString = ">>AccessDenied<<"; }); }
.NET Full Framework Konfiguration (Castle Windsor)
Benötigte Assemblies
iTsense.Moving.Common.NetStandard
iTsense.Moving.ApiV2.Common
iTsense.Moving.ApiV2.Client
iTsense.Moving.Common.ApiV2.Client.CastleWindsor
Beispielkonfiguration mit Authentifizierung via statischem API-Benutzer
public void ConfigureContainer(IWindsorContainer container) { container.AddApiV2ClientWithOpenIdPasswordFlow(o => { o.Authority = new Uri("https://coslogin.local:5000"); o.ApiBaseUri = new Uri("https://localhost:8000/apiv2"); o.ClientId = "[OpenID Client Id]"; o.ClientSecret = "[OpenID Client Secret]"; o.Username = "[OpenID User Name]"; o.Password = "[OpenID User Password]"; }); }
Mehrere Clients mit unterschiedlicher Konfiguration
Es können mehrere Clients mit unterschiedlichen Konfigurationen registriert werden. Dazu muss pro Konfiguration ein Interface deklariert. Diese können anschlissend via DependencyInjection konsumiert werden.
Die neuen Interfaces dürfen keine zusätzlichen Member enthalten!
Beispielkonfiguration
public interface IApiV2ClientUserContext : IApiV2Client { } public interface IApiV2ClientAdminContext : IApiV2Client { } public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddApiV2ClientWithHttpContextAuthentication<IApiV2ClientUserContext>(o => { o.ApiBaseUri = new Uri("https://localhost:8000/apiv2"); //o.ExplodeFlatChainProperties = false; //o.AccessDeniedReplacementString = ">>AccessDenied<<"; }); services.AddOpenIdConnectCookieAuthentication<IApiV2ClientUserContext>(options => { options.Authority = "https://coslogin.local:5000"; options.RequireHttpsMetadata = false; // dev only options.ClientId = "[OpenID Client Id]"; options.ClientSecret = "[OpenID Client Secret]"; options.ResponseType = "code"; options.ResponseMode = "form_post"; options.Scope.Add("roles"); options.Scope.Add("profile"); options.Scope.Add("offline_access"); options.SaveTokens = true; options.GetClaimsFromUserInfoEndpoint = true; options.CallbackPath = "/signin-oidc"; options.UsePkce = true; }); services.AddApiV2ClientWithOpenIdPasswordFlow<IApiV2ClientAdminContext>(o => { o.Authority = new Uri("https://coslogin.local:5000"); o.ApiBaseUri = new Uri("https://localhost:8000/apiv2"); o.ClientId = "[OpenID Client Id]"; o.ClientSecret = "[OpenID Client Secret]"; o.Username = "[OpenID User Name]"; o.Password = "[OpenID User Password]"; //o.ExplodeFlatChainProperties = false; //o.AccessDeniedReplacementString = ">>AccessDenied<<"; }); } }