Autenticação, Autorização de Usuário e Funções de Gerenciamento e Segurança geral em .NET

StackOverflow https://stackoverflow.com/questions/1222974

Pergunta

Eu preciso saber como ir sobre a implementação da segurança em geral para uma aplicação C #. Quais as opções que eu tenho a este respeito? Eu preferiria usar um quadro existente se ele atende às minhas necessidades -. Eu não quero reinventar a roda

As minhas exigências são as seguintes:

  • o costume nome de usuário / autenticação de senha
  • gestão de usuários - permissões atribuídas a usuários
  • gerenciamento de papéis - Atribuir usuários a funções, Atribuir permissões aos papéis
  • autorização de usuários com base em seu nome de usuário e papel

Eu estou procurando um free / open-source framework / biblioteca que tem sido em tempo Tesed e utilizada pela comunidade .Net.

Meu aplicativo tem uma abordagem cliente / servidor, com o servidor execução como um serviço do Windows, se conectar a um banco de dados SQL Server. A comunicação entre o cliente eo servidor será através WCF.

Uma outra coisa que é importante é que eu preciso ser capaz de atribuir usuários específicos ou permissões de papéis para ver / atualizar / excluir uma entidade específica, seja ele um cliente, ou produtos etc. Por exemplo, Jack pode ver um certo 3 de 10 clientes, mas apenas atualizar os detalhes de clientes Microsoft, Yahoo e Google, e só pode excluir Yahoo.

Foi útil?

Solução

Para a segurança de grão grosso, que você pode encontrar o código princípio inerente útil; o objeto de usuário (e suas funções) são controlados em .NET pela "principal", mas utilmente o próprio tempo de execução pode impor isso.

A implementação de um principal pode ser a implementação-definido, e você pode geralmente injetar seu próprio; por exemplo, em WCF .

Para ver o tempo de execução impondo acesso grosseiro (ou seja, que funcionalidade pode ser acessado, mas não se limitando aos quais específica dados ):

static class Roles {
    public const string Administrator = "ADMIN";
}
static class Program {
    static void Main() {
        Thread.CurrentPrincipal = new GenericPrincipal(
            new GenericIdentity("Fred"), new string[] { Roles.Administrator });
        DeleteDatabase(); // fine
        Thread.CurrentPrincipal = new GenericPrincipal(
            new GenericIdentity("Barney"), new string[] { });
        DeleteDatabase(); // boom
    }

    [PrincipalPermission(SecurityAction.Demand, Role = Roles.Administrator)]
    public static void DeleteDatabase()
    {
        Console.WriteLine(
            Thread.CurrentPrincipal.Identity.Name + " has deleted the database...");
    }
}

No entanto, isso não ajuda com o acesso de grão fino (ou seja, "Fred lata de clientes de acesso A, mas não cliente B").


Adicional; Claro que, para refinada, você pode simplesmente verificar as funções necessárias em tempo de execução, verificando IsInRole sobre o principal:

static void EnforceRole(string role)
{
    if (string.IsNullOrEmpty(role)) { return; } // assume anon OK
    IPrincipal principal = Thread.CurrentPrincipal;
    if (principal == null || !principal.IsInRole(role))
    {
        throw new SecurityException("Access denied to role: " + role);
    }
}
public static User GetUser(string id)
{
    User user = Repository.GetUser(id);
    EnforceRole(user.AccessRole);
    return user;
}

Você também pode escrever seus próprios objetos diretor / identidade que fazer testes preguiçosos / cache dos papéis, em vez de ter que conhecê-los todos up-front:

class CustomPrincipal : IPrincipal, IIdentity
{
    private string cn;
    public CustomPrincipal(string cn)
    {
        if (string.IsNullOrEmpty(cn)) throw new ArgumentNullException("cn");
        this.cn = cn;
    }
    // perhaps not ideal, but serves as an example
    readonly Dictionary<string, bool> roleCache =
        new Dictionary<string, bool>();
    public override string ToString() { return cn; }
    bool IIdentity.IsAuthenticated { get { return true; } }
    string IIdentity.AuthenticationType { get { return "iris scan"; } }
    string IIdentity.Name { get { return cn; } }
    IIdentity IPrincipal.Identity { get { return this; } }

    bool IPrincipal.IsInRole(string role)
    {
        if (string.IsNullOrEmpty(role)) return true; // assume anon OK
        lock (roleCache)
        {
            bool value;
            if (!roleCache.TryGetValue(role, out value)) {
                value = RoleHasAccess(cn, role);
                roleCache.Add(role, value);
            }
            return value;
        }
    }
    private static bool RoleHasAccess(string cn, string role)
    {
        //TODO: talk to your own security store
    }
}

Outras dicas

do ASP.NET provedores de associação . Eu não acho que o fora da caixa SqlMembershipProvider irá funcionar no seu caso, mas é fácil o suficiente para rolar o seu próprio provedor.

minha resposta é provavelmente dependente da resposta a esta pergunta: Trata-se de um aplicativo corporativo que vive dentro de uma rede com Active Directory

?

Se a resposta for sim, então esses são os passos que eu iria fornecer:

1) Criar grupos globais para a sua aplicação, no meu caso, eu tinha um grupo appuser e um grupo AppAdmin.

2) Ter o seu SQL Server poderá ser acessado no modo de autenticação mista, e depois atribuir o seu grupo appuser (s) como o login do servidor SQL para seu banco de dados com os direitos CRUD apropriadas para o seu DB (s), e garantir que você acessar o servidor SQL com Trusted Connection = True na cadeia de ligação.

Neste ponto, sua loja AD será responsável pela autenticação. Uma vez que, você está acessando o aplicativo por meio de uma conexão confiável, passará a identidade de qualquer conta está executando o aplicativo para o SQL Server.

Agora, para a autorização (ou seja, contando a sua aplicação que o usuário conectado é permitido fazer) é uma simples questão de consultar AD para uma lista de grupos que o usuário conectado é um membro do grupo. Em seguida, verificar os nomes de grupo apropriadas e construir sua interface baseada na associação desta forma.

A forma como os meus aplicativos funcionam são assim:

  1. Iniciando a aplicação, as credenciais baseiam-se na sessão de utilizador, isto é o aspecto principal de autenticação (isto é, eles podem, por conseguinte, em log eles existem)
  2. I Get todos os grupos para o Windows Identity em questão
  3. I verificar o User Group Standard - se este grupo não existe para o Windows Identity em questão, então isso é uma falha de autenticação
  4. I buscar por Admin User Group - Com essa existente em grupos do usuário, eu modificar a interface do usuário para permitir o acesso a componentes de administração
  5. Mostrar a UI

Em seguida, tenho um objeto de PRINCÍPIO com os direitos determinadas / etc sobre ele, ou eu utilizar variáveis ??globais que eu possa acessar para determinar a interface do usuário apropriado ao construir meus formulários (ou seja, se o meu usuário não é um membro do grupo ADMIN , então eu esconder todos os botões Apagar).

Por que eu sugiro que isso?

É uma questão de implantação.

Tem sido minha experiência que a maioria das aplicações empresariais são implantados pela Rede Engenheiros em vez de programadores - portanto, ter Autenticação / Autorização para ser da responsabilidade do AD faz sentido, pois é aí que os caras de rede ir quando você discutir Autenticação / Autorização.

Além disso, durante a criação de novos usuários para a rede, um engenheiro de rede (ou quem é responsável pela criação de novos usuários de rede) é mais apto a se lembrar de executar trabalhos de grupo, enquanto eles estão na DA do que o fato de que eles têm de entrar em uma dúzia de aplicativos para analisar a cessão de autorização.

Fazer isso ajuda com o labirinto de permissões e direitos que novas contratações precisam ser concedido ou aqueles que saem a necessidade empresa a ser negado e mantém autenticação e autorização no repositório central onde ele pertence (ou seja, em AD @ Domain Controller nível).

Gostaria de dar uma olhada em algo como CSLA.net: Especialista C # 2008 Business Objects

Ele deve fornecer tudo que você precisa.

WCF tem funcionalidade relacionada segurança rica fornece tanto a autorização e autenticação. Em detalhes aqui: http://msdn.microsoft.com/en-us/library/ms735093. aspx

Eu acho que você está olhando para alguns problemas distintos aqui - não é por acaso a maioria dos sistemas de segurança de autenticação e autorização separada.

Para a autenticação, a grande questão é logístico. Ou, há um lugar lógico para esses usuários para viver, seja localmente para a aplicação, no Active Directory, alguma outra loja de LDAP ou mesmo em algum outro aplicativo. Exatamente onde é bastante imaterial - nós apenas precisamos de ser capazes de identificar solidamente usuários e de preferência fazem problema que tarefa de outra pessoa. Final do dia, você realmente só precisa de um identificador único e do conforto que Bob da contabilidade é realmente Bob de Contabilidade.

A autorização é a parte mais interessante do problema aqui. Eu acho que, se ele é realmente de grão fino, que você realmente quer para gerir este totalmente dentro de sua aplicação, não importa onde os usuários vêm. Marc Gravell realmente bater em uma boa maneira de modelo de pelo menos alguns dos isso - usar alguns implementação personalizada do IPrincipal e PrincipalPermission para gerir as coisas é uma maneira muito limpo para começar. Além de que você pode usar técnicas como este para tomar decisões de autorização mais complexos de uma forma bastante limpa.

Gostaria de usar o termo -. 'RBAC' (Role com base sistema de controle de acesso) como a solução para todos os seus requisitos

Eu não iria em muitos detalhes para explicar 'RBAC' aqui, em vez eu poderia descrevê-lo brevemente como:

É basicamente contém 3 características.

1) Autenticação - Ela confirma a identidade do usuário. Normalmente, isso é feito através de contas de usuário e senhas ou credenciais.

2) Autorização - Ele define o que o usuário pode fazer e não pode fazer em um aplicativo. Ex. ‘Ordem Modificando’ é permitido, mas ‘criar nova ordem’ não é permitido.

3) Auditoria de ações do usuário em aplicativos. - Ele mantém o controle das ações do usuário em aplicações, bem como que concedeu que acesso a quais usuários?

você pode verificar RBAC no wiki aqui.

https://en.wikipedia.org/wiki/Role-based_access_control

Agora, quanto resposta para suas necessidades -. Uma das soluções possíveis é ampliar a adesão ASP.NET como por suas necessidades

E a respeito, alguns prontos para usar quadro, eu recomendaria VisualGuard para o qual eu trabalho, você deve verificar isso, Ele faz todas as coisas que você precisa muito facilmente, eo que é mais importante, Ele gerencia todos os seus usuários, funções, permissões e aplicativos através do Console de Administração Central, e para as permissões que definem , os administradores não requerem conhecimento do desenvolvedor, ou seja, ele / ela pode criar restrições às atividades via interface do usuário.

Você também pode verificar este artigo para ter mais entendimento sobre permissão e sistema baseado em papel.

http://www.visual-guard.com/EN/net-powerbuilder-application-security-authentication-permission-access-control-rbac -obras / dotnet-segurança-article-recursos / role-based-access-control-source_soforum.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top