/// <summary>
        /// Verifica se determinado usuário possui determinada permissão.
        /// Caso não possua a permissão, será lançada uma exceção <see cref="PermissionDeniedException"/>.
        /// </summary>
        /// <param name="user">O usuário</param>
        /// <param name="permission">A permissão a verificar. Se não for especificada ou estiver em branco, a verificação retorna, sem erros</param>
        /// <param name="errorMessage">A mensagem de erro a exibir, caso a permissão falhe</param>
        /// <param name="errorMessageArguments">Os argumentos para montar a mensagem de erro</param>
        /// <exception cref="PermissionDeniedException">Caso o usuário não possua a permissão solicitada</exception>
        /// <exception cref="ArgumentNullException">Caso não seja especificado o <paramref name="user"/></exception>
        public void CheckPermission(ISimpleAppUser user, string permission, string errorMessage, params object[] errorMessageArguments)
        {
            if (String.IsNullOrEmpty(permission))
            {
                return;
            }

            if (user == null)
            {
                throw new ArgumentNullException("user", "Parâmetro 'user' não pode ser nulo");
            }

            if (user.Roles != null)
            {
                foreach (IAppRole role in user.Roles)
                {
#pragma warning disable 618,612
                    if (role.Permissions != null)
                    {
                        foreach (IAppPermission perm in role.Permissions)
                        {
                            if (perm.Id == permission)
                            {
                                return;
                            }
                        }
                    }
#pragma warning restore 618,612
                }
            }

            throw new PermissionDeniedException(String.Format(errorMessage, errorMessageArguments));
        }
		public bool IsAllowed(ISimpleAppUser user)
		{
			foreach (ISecurityRule rule in rules)
				if (rule != null && !rule.IsAllowed(user))
					return false;
			return true;
		}
Beispiel #3
0
        /// <summary>
        /// Constrói as informações de usuário que serão armazenadas no <see cref="FormsAuthenticationTicket"/>.
        /// </summary>
        private FormsAuthenticationTicket ConstroiTicket(ISimpleAppUser user, IDictionary userData, bool persist)
        {
            string serializedUserData;

            using (var ms = new MemoryStream())
            {
                using (var gzs = new GZipStream(ms, CompressionMode.Compress))
                {
                    var fmt = new BinaryFormatter();
                    fmt.Serialize(gzs, userData);
                }
                ms.Flush();
                serializedUserData = Convert.ToBase64String(ms.ToArray());
            }

            // versões de tickets:
            // 1: apenas papeis e nome completo
            // 2: IDictionary para armazenar dados variáveis
            var ticket =
                new FormsAuthenticationTicket(
                    VersaoTicket,                // versão. aumentar a cada alteração para evitar erros
                    user.Login,                  // nome do usuário
                    DateTime.Now,                // data do login
                    DateTime.Now.AddHours(6),    // expiração
                    persist,                     // cookie persistente ou não
                    serializedUserData,          // informações do usuário
                    FormsAuthentication.FormsCookiePath
                    );

            return(ticket);
        }
Beispiel #4
0
 public bool IsAllowed(ISimpleAppUser user)
 {
     foreach (ISecurityRule rule in rules)
     {
         if (rule != null && !rule.IsAllowed(user))
         {
             return(false);
         }
     }
     return(true);
 }
        private void VerificaPermissaoLogin(ISimpleAppUser user)
        {
            CheckPermission(user, PermissionForLogin, "Usuário '{0}' não tem permissão para efetuar login", user.Name);

            if (!user.IsActive)
            {
                Log.Error("Tentativa de login de usuário INATIVO: '{0}'", user.Name);
                throw new SecurityException("Usuário inativo");
            }

            if (securityRulesProvider != null && !securityRulesProvider.IsAllowed(user))
            {
                Log.Warn("Login do usuário '{0}' negado por regra específica", user.Name);
                throw new SecurityException(String.Format("Login não permitido para o usuário '{0}'", user.Name));
            }
        }
		public void AlteraSenha(ISimpleAppUser user, string senha, string senha2)
		{
			if (user.IsNew)
			{
				// se o usuário é novo, o preenchimento da senha é obrigatório
				if (String.IsNullOrEmpty(senha))
					throw new RequiredFieldNotFilledException("Senha");
			}
			else
			{
				// se o usuário já existe, e não é o usuário conectado,
				// verifica primeiro se o usuário conectado tem permissão para alterar senhas de outros usuários.
				if (user.Id != Principal.Identity.UserID)
					CheckPermission(Principal, PermissionForChangePasswords, "User does not have the required privileges to change other user's password");

				// a senha não é obrigatória, se estiver em branco, mantém a senha já cadastrada.
				if (String.IsNullOrEmpty(senha) && String.IsNullOrEmpty(senha2))
					return;
			}

			if (String.IsNullOrEmpty(senha))
				throw new RequiredFieldNotFilledException("Senha");
			if (String.IsNullOrEmpty(senha2))
				throw new RequiredFieldNotFilledException("Confirmação da Senha");
			if (senha != senha2)
				throw new BusinessRuleViolationException("Confirmação de senha incorreta", "A senha e a confirmação não conferem.");

			user.Password = CriptografaSenha(senha);
			if (!Log.IsWarnEnabled)
				return;

			if (user.IsNew)
			{
				var roleNames = new StringBuilder(); // = user.Role != null ? "'" + user.Role.Name + "'" : "(nenhum)";
				foreach (IAppRole role in user.Roles)
					roleNames.Append(role.Name).Append(", ");
				if (roleNames.Length > 0)
					roleNames.Length -= 2;
				Log.WarnFormat("Criado novo usuário, papeis: {0}, login: '******', nome: '{2}'", roleNames, user.Login, user.Name);
			}
			else
				Log.WarnFormat("Alterada senha do usuário #{0}, login: '******', nome: '{2}'", user.Id, user.Login, user.Name);

			var request = RailsContext.UnderlyingContext.Request;
			Log.WarnFormat("Endereço IP da solicitação: {0} ({1})", request.UserHostAddress, request.UserHostName);
		}
Beispiel #7
0
        protected override IExtendedPrincipal DefineUsuarioConectado(ISimpleAppUser user, bool persist, bool fromAutoLogin)
        {
            var principal = CriaIPrincipal(user, true);

            if (user == null)
            {
                // remove o usuário do log
                LogUtil.SetLoggingProperty("id", null);

                // realiza o logoff
                FormsAuthentication.SignOut();

                return(principal);
            }

            // atribui o login do usuário ao log
            LogUtil.SetLoggingProperty("id", principal.Identity.Login);

            var userData = this.CriaDadosUsuario(user);

            // cria o ticket do FormsAuthentication
            var ticket = ConstroiTicket(user, userData, persist);

            // encripta o ticket e adiciona a um cookie
            var encTicket = FormsAuthentication.Encrypt(ticket);
            var cookie    = this.CreateCookieForFormsAuth();

            cookie.Value = encTicket;
            AspNetContext.Response.Cookies.Add(cookie);

            // redireciona à página correta
            var redirectUrl = FormsAuthentication.GetRedirectUrl(principal.Identity.Login, false);

            if (!String.IsNullOrEmpty(redirectUrl) && redirectUrl.StartsWith(RailsContext.ApplicationPath))
            {
                RailsContext.Response.Redirect(redirectUrl);
            }
            else
            {
                RailsContext.Response.Redirect(RailsContext.ApplicationPath + '/');
            }

            return(principal);
        }
Beispiel #8
0
        /// <summary>
        /// Cria os dados básicos do usuário.
        /// </summary>
        protected virtual IDictionary CriaDadosUsuario(ISimpleAppUser user)
        {
            IDictionary userData =
                new Hashtable
            {
                { "id", user.Id },
                { "papeis", user.Roles.Select(r => r.Name).ToArray() },
                { "nomeCompleto", user.Name },
                { "ip", AspNetContext.Request.UserHostAddress },
            };

            if (user is IAppUser)
            {
                userData.Add("hash", this.ObtemTokenParaLoginAutomatico((IAppUser)user, true, true));
            }

            ComplementaDadosUsuario((T)user, userData);

            return(userData);
        }
        /// <summary>
        /// Cria um objeto <see cref="IExtendedPrincipal"/>, com base no <see cref="ISimpleAppUser"/>
        /// passado. Dificilmente será necessário sobrecrever esse método.
        /// </summary>
        protected virtual IExtendedPrincipal CriaIPrincipal(ISimpleAppUser user, bool autenticado)
        {
            if (user == null)
            {
                return(null);
            }

            var bld = new UserBuilder(user.Id, autenticado, user.Name)
            {
                Login = user.Login
            };

            if (user.Roles != null)
            {
                foreach (IAppRole role in user.Roles)
#pragma warning disable 618,612
                {
                    foreach (IAppPermission p in role.Permissions)
                    {
                        bld.AddPermission(role.Name, Permission.SetPermission(p.Id, p.Name));
                    }
                }
#pragma warning restore 618,612
            }

            IExtendedPrincipal u = bld.Build();
            if (user.Roles != null)
            {
                foreach (IAppRole role in user.Roles)
                {
#pragma warning disable 618,612
                    if (role != null && role.Profile != null)
                    {
                        u.Properties["skin"] = role.Profile.Skin;
                        u.Properties["home"] = role.Profile.Home;
                    }
#pragma warning restore 618,612
                }
            }
            return(u);
        }
        protected virtual IExtendedPrincipal DefineUsuarioConectado(ISimpleAppUser user, bool persist, bool fromAutoLogin)
        {
            var principal = CriaIPrincipal(user, true);

            var ctx = RailsContext;

            ctx.Session[CurrentUserSessionKey] = principal;
            Thread.CurrentPrincipal            = ctx.CurrentUser = principal;

            if (user == null)
            {
                // remove o cookie e o token do auto-login
                LimpaTokenAutoLogin(ctx, null);
                // remove o usuário do log
                LogUtil.SetLoggingProperty("id", null);
            }
            else
            {
                // atribui o login do usuário ao log
                LogUtil.SetLoggingProperty("id", principal.Identity.Login);

                if (user is IAppUser)
                {
                    // se é auto-login, não limpa nem recria o token
                    if (!fromAutoLogin)
                    {
                        if (!persist)
                        {
                            LimpaTokenAutoLogin(ctx, (IAppUser)user);
                        }
                        else
                        {
                            DefineCookieAutoLogin(ObtemTokenParaLoginAutomatico((IAppUser)user, true, false), DateTime.Now.AddDays(1));
                        }
                    }
                }
            }

            return(principal);
        }
 /// <summary>
 /// Método chamado quando o processo de login finaliza corretamente.
 /// </summary>
 protected virtual void OnLoginOK(ISimpleAppUser user)
 {
 }
		/// <summary>
		/// Verifica se determinado usuário possui determinada permissão.
		/// Caso não possua a permissão, será lançada uma exceção <see cref="PermissionDeniedException"/>.
		/// </summary>
		/// <param name="user">O usuário</param>
		/// <param name="permission">A permissão a verificar. Se não for especificada ou estiver em branco, a verificação retorna, sem erros</param>
		/// <param name="errorMessage">A mensagem de erro a exibir, caso a permissão falhe</param>
		/// <param name="errorMessageArguments">Os argumentos para montar a mensagem de erro</param>
		/// <exception cref="PermissionDeniedException">Caso o usuário não possua a permissão solicitada</exception>
		/// <exception cref="ArgumentNullException">Caso não seja especificado o <paramref name="user"/></exception>
		public void CheckPermission(ISimpleAppUser user, string permission, string errorMessage, params object[] errorMessageArguments)
		{
			if (String.IsNullOrEmpty(permission))
				return;

			if (user == null)
				throw new ArgumentNullException("user", "Parâmetro 'user' não pode ser nulo");

			if (user.Roles != null)
			{
				foreach (IAppRole role in user.Roles)
				{
#pragma warning disable 618,612
					if (role.Permissions != null)
					{
						foreach (IAppPermission perm in role.Permissions)
							if (perm.Id == permission)
								return;
					}
#pragma warning restore 618,612
				}
			}

			throw new PermissionDeniedException(String.Format(errorMessage, errorMessageArguments));
		}
		/// <summary>
		/// Cria um objeto <see cref="IExtendedPrincipal"/>, com base no <see cref="ISimpleAppUser"/>
		/// passado. Dificilmente será necessário sobrecrever esse método.
		/// </summary>
		protected virtual IExtendedPrincipal CriaIPrincipal(ISimpleAppUser user, bool autenticado)
		{
			if (user == null)
				return null;

			var bld = new UserBuilder(user.Id, autenticado, user.Name) { Login = user.Login };

			if (user.Roles != null)
			{
				foreach (IAppRole role in user.Roles)
#pragma warning disable 618,612
					foreach (IAppPermission p in role.Permissions)
						bld.AddPermission(role.Name, Permission.SetPermission(p.Id, p.Name));
#pragma warning restore 618,612
			}

			IExtendedPrincipal u = bld.Build();
			if (user.Roles != null)
			{
				foreach (IAppRole role in user.Roles)
				{
#pragma warning disable 618,612
					if (role != null && role.Profile != null)
					{
						u.Properties["skin"] = role.Profile.Skin;
						u.Properties["home"] = role.Profile.Home;
					}
#pragma warning restore 618,612
				}
			}
			return u;
		}
		protected virtual IExtendedPrincipal DefineUsuarioConectado(ISimpleAppUser user, bool persist, bool fromAutoLogin)
		{
			var principal = CriaIPrincipal(user, true);

			var ctx = RailsContext;

			ctx.Session[CurrentUserSessionKey] = principal;
			Thread.CurrentPrincipal = ctx.CurrentUser = principal;

			if (user == null)
			{
				// remove o cookie e o token do auto-login
				LimpaTokenAutoLogin(ctx, null);
				// remove o usuário do log
				LogUtil.SetLoggingProperty("id", null);
			}
			else
			{
				// atribui o login do usuário ao log
				LogUtil.SetLoggingProperty("id", principal.Identity.Login);

				if (user is IAppUser)
				{
					// se é auto-login, não limpa nem recria o token
					if (!fromAutoLogin)
					{
						if (!persist)
							LimpaTokenAutoLogin(ctx, (IAppUser) user);
						else
							DefineCookieAutoLogin(ObtemTokenParaLoginAutomatico((IAppUser) user, true, false), DateTime.Now.AddDays(1));
					}
				}
			}

			return principal;
		}
		private void VerificaPermissaoLogin(ISimpleAppUser user)
		{
			CheckPermission(user, PermissionForLogin, "Usuário '{0}' não tem permissão para efetuar login", user.Name);

			if (!user.IsActive)
			{
				Log.Error("Tentativa de login de usuário INATIVO: '{0}'", user.Name);
				throw new SecurityException("Usuário inativo");
			}

			if (securityRulesProvider != null && !securityRulesProvider.IsAllowed(user))
			{
				Log.Warn("Login do usuário '{0}' negado por regra específica", user.Name);
				throw new SecurityException(String.Format("Login não permitido para o usuário '{0}'", user.Name));
			}
		}
		protected virtual bool ComparaSenha(ISimpleAppUser user, string password)
		{
			return user.Password == (hashedOnClient ? password : CriptografaSenha(password));
		}
		/// <summary>
		/// Método chamado quando o processo de login finaliza corretamente.
		/// </summary>
		protected virtual void OnLoginOK(ISimpleAppUser user)
		{
		}
 protected virtual bool ComparaSenha(ISimpleAppUser user, string password)
 {
     return(user.Password == (hashedOnClient ? password : CriptografaSenha(password)));
 }
        public void AlteraSenha(ISimpleAppUser user, string senha, string senha2)
        {
            if (user.IsNew)
            {
                // se o usuário é novo, o preenchimento da senha é obrigatório
                if (String.IsNullOrEmpty(senha))
                {
                    throw new RequiredFieldNotFilledException("Senha");
                }
            }
            else
            {
                // se o usuário já existe, e não é o usuário conectado,
                // verifica primeiro se o usuário conectado tem permissão para alterar senhas de outros usuários.
                if (user.Id != Principal.Identity.UserID)
                {
                    CheckPermission(Principal, PermissionForChangePasswords, "User does not have the required privileges to change other user's password");
                }

                // a senha não é obrigatória, se estiver em branco, mantém a senha já cadastrada.
                if (String.IsNullOrEmpty(senha) && String.IsNullOrEmpty(senha2))
                {
                    return;
                }
            }

            if (String.IsNullOrEmpty(senha))
            {
                throw new RequiredFieldNotFilledException("Senha");
            }
            if (String.IsNullOrEmpty(senha2))
            {
                throw new RequiredFieldNotFilledException("Confirmação da Senha");
            }
            if (senha != senha2)
            {
                throw new BusinessRuleViolationException("Confirmação de senha incorreta", "A senha e a confirmação não conferem.");
            }

            user.Password = CriptografaSenha(senha);
            if (!Log.IsWarnEnabled)
            {
                return;
            }

            if (user.IsNew)
            {
                var roleNames = new StringBuilder();                 // = user.Role != null ? "'" + user.Role.Name + "'" : "(nenhum)";
                foreach (IAppRole role in user.Roles)
                {
                    roleNames.Append(role.Name).Append(", ");
                }
                if (roleNames.Length > 0)
                {
                    roleNames.Length -= 2;
                }
                Log.WarnFormat("Criado novo usuário, papeis: {0}, login: '******', nome: '{2}'", roleNames, user.Login, user.Name);
            }
            else
            {
                Log.WarnFormat("Alterada senha do usuário #{0}, login: '******', nome: '{2}'", user.Id, user.Login, user.Name);
            }

            var request = RailsContext.UnderlyingContext.Request;

            Log.WarnFormat("Endereço IP da solicitação: {0} ({1})", request.UserHostAddress, request.UserHostName);
        }