/// <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; }
/// <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); }
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); }
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); }
/// <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; }
protected virtual bool ComparaSenha(ISimpleAppUser user, string password) { return user.Password == (hashedOnClient ? password : CriptografaSenha(password)); }
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); }