Exemplo n.º 1
0
        /// <summary>
        /// Checks if a user meets a specific set of requirements for the specified resource.
        /// </summary>
        /// <param name="user">The user to evaluate the requirements against.</param>
        /// <param name="resource">The resource to evaluate the requirements against.</param>
        /// <param name="requirements">The requirements to evaluate.</param>
        /// <returns>
        /// A flag indicating whether authorization has succeded.
        /// This value is <value>true</value> when the user fulfills the policy otherwise <value>false</value>.
        /// </returns>
        public async Task <bool> AuthorizeAsync(ClaimsPrincipal user, object resource, IEnumerable <IAuthorizationRequirement> requirements)
        {
            if (requirements == null)
            {
                throw new ArgumentNullException(nameof(requirements));
            }

            var authContext = _contextFactory.CreateContext(requirements, user, resource);

            foreach (var handler in _handlers)
            {
                await handler.HandleAsync(authContext);

                if (!_options.InvokeHandlersAfterFailure && authContext.HasFailed)
                {
                    break;
                }
            }

            if (_evaluator.HasSucceeded(authContext))
            {
                _logger.UserAuthorizationSucceeded(GetUserNameForLogging(user));
                return(true);
            }
            else
            {
                _logger.UserAuthorizationFailed(GetUserNameForLogging(user));
                return(false);
            }
        }