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);
        }
예제 #3
0
        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}")));
            }
        }
예제 #4
0
 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);
        }