public static void UseHelseIdProtectedPaths(this IApplicationBuilder app, IHelseIdWebKonfigurasjon config, IHprFeatureFlags hprFlags, IRedirectPagesKonfigurasjon redirect, IReadOnlyCollection <PathString> excludeList) { if (!config.AuthUse) { return; } var excluded = new List <PathString> { "/favicon.ico", redirect.Forbidden, redirect.LoggedOut, redirect.Statuscode }; if (excludeList != null && excludeList.Any()) { excluded.AddRange(excludeList); } app.UseProtectPaths(new ProtectPathsOptions(DeterminePresidingPolicy(config, hprFlags), redirect.Forbidden) { Exclusions = excluded }); }
public static (bool Result, string PolicyName) AddHelseIdWebAuthentication(this IServiceCollection services, IHelseIdWebKonfigurasjon helseIdKonfigurasjon, IRedirectPagesKonfigurasjon redirectPagesKonfigurasjon, IHprFeatureFlags hprKonfigurasjon, IWhitelist whitelist, IHelseIdSecretHandler?secretHandler = null) { if (!helseIdKonfigurasjon.AuthUse) { return(false, ""); } services.AddScoped <IHprFactory, HprFactory>(); services.AddScoped <ICurrentUser, CurrentHttpUser>(); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); (var authorizeFilter, string policyName) = AddAuthentication(services, helseIdKonfigurasjon, redirectPagesKonfigurasjon, hprKonfigurasjon, whitelist, secretHandler); services.AddControllers(config => config.Filters.Add(authorizeFilter)); if (helseIdKonfigurasjon.UseHprNumber) { services.AddScoped <IAuthorizationHandler, HprAuthorizationHandler>(); } if (hprKonfigurasjon.UseHpr && hprKonfigurasjon.UseHprPolicy) { services.AddScoped <IAuthorizationHandler, HprGodkjenningAuthorizationHandler>(); } return(true, policyName); }
public static void DefaultHelseIdOptions(this OpenIdConnectOptions options, IHelseIdWebKonfigurasjon configAuth, IRedirectPagesKonfigurasjon redirectPagesKonfigurasjon, IHelseIdSecretHandler?secretHandler = null) { var acrValues = GetAcrValues(configAuth); // spesielt for id-porten, e.g. krever sikkerhetsnivå 4 var hasAcrValues = !string.IsNullOrWhiteSpace(acrValues); options.Authority = configAuth.Authority; options.RequireHttpsMetadata = true; options.ClientId = configAuth.ClientId; options.ResponseType = "code"; options.TokenValidationParameters.ValidAudience = configAuth.ClientId; options.CallbackPath = "/signin-callback"; options.SignedOutCallbackPath = "/signout-callback"; options.Scope.Clear(); //options.CorrelationCookie.SameSite = SameSiteMode.Lax; //options.NonceCookie.SameSite = SameSiteMode.Lax; foreach (var scope in configAuth.AllScopes) { options.Scope.Add(scope.Trim()); } options.SaveTokens = true; options.Events.OnRedirectToIdentityProvider = ctx => { //API requests should get a 401 status instead of being redirected to login if (ctx.Request.Path.StartsWithSegments("/api")) { ctx.Response.Headers["Location"] = ctx.ProtocolMessage.CreateAuthenticationRequestUrl(); ctx.Response.StatusCode = StatusCodes.Status401Unauthorized; ctx.HandleResponse(); } if (ctx.ProtocolMessage.RequestType == OpenIdConnectRequestType.Authentication && hasAcrValues) { ctx.ProtocolMessage.AcrValues = acrValues; } return(Task.CompletedTask); }; options.AccessDeniedPath = redirectPagesKonfigurasjon.Forbidden; if (secretHandler == null) { // Defaults to Shared Secret to be backwards compatible secretHandler = new HelseIdSharedSecretHandler(); } secretHandler.AddSecretConfiguration(configAuth, options); string GetAcrValues(IHelseIdWebKonfigurasjon helseIdWebKonfigurasjon) { return(string.Join(' ', helseIdWebKonfigurasjon.SecurityLevels.Select(sl => $"Level{sl}"))); } }
public static void DefaultHelseIdOptions(this CookieAuthenticationOptions options, IHelseIdWebKonfigurasjon configAuth, IRedirectPagesKonfigurasjon redirectPagesKonfigurasjon) { options.ExpireTimeSpan = TimeSpan.FromMinutes(60); options.SlidingExpiration = true; options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; options.Cookie.SecurePolicy = configAuth.UseHttps ? CookieSecurePolicy.Always : CookieSecurePolicy.SameAsRequest; options.AccessDeniedPath = redirectPagesKonfigurasjon.Forbidden; // NOTE: options.Events must be set in AddAutomaticTokenManagement. // This is because it overrides the events set here. }
/// <summary> /// Normally used by AddHelseIdWebAuthentication /// </summary> public static (AuthorizeFilter AuthorizeFilter, string PolicyName) AddAuthentication(IServiceCollection services, IHelseIdWebKonfigurasjon helseIdKonfigurasjon, IRedirectPagesKonfigurasjon redirectPagesKonfigurasjon, IHprFeatureFlags hprKonfigurasjon, IWhitelist whitelist, IHelseIdSecretHandler?secretHandler = null ) { const double tokenRefreshBeforeExpirationTime = 2; services.AddHelseIdAuthentication() .AddCookie(options => { options.DefaultHelseIdOptions(helseIdKonfigurasjon, redirectPagesKonfigurasjon); }) .AddOpenIdConnect(HelseIdContext.Scheme, options => { options.DefaultHelseIdOptions(helseIdKonfigurasjon, redirectPagesKonfigurasjon, secretHandler); }) .AddAutomaticTokenManagement(options => options.DefaultHelseIdOptions(tokenRefreshBeforeExpirationTime)); // For å kunne ha en lengre sesjon, håndterer refresh token (var authPolicy, string policyName) = services.AddHelseIdAuthorizationPolicy(helseIdKonfigurasjon, hprKonfigurasjon, helseIdKonfigurasjon, whitelist); return(new AuthorizeFilter(authPolicy), policyName); }