public void PostConfigure(string name, JwtBearerOptions options)
        {
            MonitorApiKeyConfiguration configSnapshot = _apiKeyConfig.CurrentValue;

            if (configSnapshot.ValidationErrors.Any())
            {
                options.SecurityTokenValidators.Add(new RejectAllSecurityValidator());
                return;
            }

            TokenValidationParameters tokenValidationParameters = new TokenValidationParameters
            {
                // Signing Settings
                RequireSignedTokens = true,
                ValidAlgorithms     = JwtAlgorithmChecker.GetAllowedJwsAlgorithmList(),

                // Issuer Settings
                ValidateIssuer           = false,
                ValidateIssuerSigningKey = true,
                IssuerSigningKeys        = new SecurityKey[] { configSnapshot.PublicKey },
                TryAllIssuerSigningKeys  = true,

                // Audience Settings
                ValidateAudience = true,
                ValidAudiences   = new string[] { AuthConstants.ApiKeyJwtAudience },

                // Other Settings
                ValidateActor    = false,
                ValidateLifetime = false,
            };

            options.TokenValidationParameters = tokenValidationParameters;
        }
 private void CheckMonitorApiKeyOptions(MonitorApiKeyConfiguration options)
 {
     // ValidationErrors will be null if API key authentication is not enabled.
     if (null != options.ValidationErrors && options.ValidationErrors.Any())
     {
         _logger.ApiKeyValidationFailures(options.ValidationErrors);
     }
     else
     {
         _logger.ApiKeyAuthenticationOptionsValidated();
     }
 }
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AuthorizedUserRequirement requirement)
        {
            if (context.User.Identity.AuthenticationType == AuthConstants.FederationAuthType)
            {
                // If we get a FederationAuthType (Bearer from a Jwt Token) we need to check that the user has the specified subject claim.
                MonitorApiKeyConfiguration configSnapshot = _apiKeyConfig.CurrentValue;
                if (context.User.HasClaim(ClaimTypes.NameIdentifier, configSnapshot.Subject))
                {
                    context.Succeed(requirement);
                }
            }
            else if ((context.User.Identity.AuthenticationType == AuthConstants.NtlmSchema) ||
                     (context.User.Identity.AuthenticationType == AuthConstants.KerberosSchema) ||
                     (context.User.Identity.AuthenticationType == AuthConstants.NegotiateSchema))
            {
                // Only supported on Windows
                if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                {
                    return(Task.CompletedTask);
                }

                //Negotiate, Kerberos, or NTLM.
                //CONSIDER In the future, we may want to have configuration around a dotnet-monitor group sid instead.
                //We cannot check the user against BUILTIN\Administrators group membership, since the browser user
                //has a deny claim on Administrator group.
                //Validate that the user that logged in matches the user that is running dotnet-monitor
                //Do not allow at all if running as Administrator.
                WindowsIdentity  currentUser = WindowsIdentity.GetCurrent();
                WindowsPrincipal principal   = new WindowsPrincipal(currentUser);
                if (principal.IsInRole(WindowsBuiltInRole.Administrator))
                {
                    return(Task.CompletedTask);
                }

                Claim currentUserClaim = currentUser.Claims.FirstOrDefault(claim => string.Equals(claim.Type, ClaimTypes.PrimarySid));
                if ((currentUserClaim != null) && context.User.HasClaim(currentUserClaim.Type, currentUserClaim.Value))
                {
                    context.Succeed(requirement);
                }
            }

            return(Task.CompletedTask);
        }
 private void OnMonitorApiKeyOptionsChanged(MonitorApiKeyConfiguration options)
 {
     CheckMonitorApiKeyOptions(options);
 }
Example #5
0
 private void OnReload(MonitorApiKeyConfiguration options)
 {
     Interlocked.Exchange(ref _reloadToken, new ConfigurationReloadToken()).OnReload();
 }