Beispiel #1
0
        /// <summary>
        /// 检查给定的用户名和密码是否正确。
        /// </summary>
        /// <param name="username">用户名。</param>
        /// <param name="password">密码。</param>
        /// <returns>给定的用户名和密码是否正确。</returns>
        /// <exception cref="ArgumentNullException">
        ///     <paramref name="username"/> 为 null
        ///     或
        ///     <paramref name="password"/> 为 null。
        /// </exception>
        /// <exception cref="RepositoryException">访问底层数据源时出现错误。</exception>
        public async Task <bool> ChallengeAsync(string username, string password)
        {
            Contract.NotNull(username, nameof(username));
            Contract.NotNull(password, nameof(password));

            var passwordHash = await ThrowRepositoryExceptionOnErrorAsync(
                async (collection, _) =>
            {
                return(await collection.Find(GetKeyFilter(username))
                       .Project(u => u.PasswordHash)
                       .FirstOrDefaultAsync());
            });

            if (passwordHash == null)
            {
                return(false);
            }

            return(PasswordUtils.Challenge(passwordHash, password));
        }
Beispiel #2
0
        /// <summary>
        /// 检查给定的密码的哈希值是否与当前的 <see cref="User"/> 实体对象中保存的密码哈希值一致。
        /// </summary>
        /// <param name="password">要检查的密码。</param>
        /// <returns>给定的密码的哈希值是否与当前的 <see cref="User"/> 实体对象中保存的密码哈希值一致。</returns>
        /// <exception cref="ArgumentNullException"><paramref name="password"/> 为 null。</exception>
        public bool Challenge(string password)
        {
            Contract.NotNull(password, nameof(password));

            return(PasswordUtils.Challenge(PasswordHash, password));
        }