Como definir a autenticação de tempo de execução no ASP.NET Core?

8

Estou criando um aplicativo em que há gerenciamento de módulo baseado em função e ele é alterado a qualquer momento. Cenário:

  • Se um usuário tiver acesso para criar e exibir Empregado, um usuário poderá criar e exibir apenas funcionários, mas no futuro administrador altere a função do usuário de criar e exibir para exibir e excluir, pois um usuário poderá realizar apenas essa atividade.

Eu tento com, [Authorize(Roles ="Staff")]mas se o administrador alterar o tempo de execução, ele não será gerenciado.

Alguém pode investigar isso e voltar para mim?

Deep Soni
fonte
Authorize(Roles ="Staff")garante que o usuário com função Staffsomente possa acessar esta ação ... Portanto, se o usuário for removido dessa função, o usuário não poderá acessar isso. Isso não está acontecendo?
Chetan Ranpariya 7/11
Tanto quanto sei, isso não é possível e talvez não seja uma boa ideia. Os usuários devem fazer logoff e logon novamente para aplicar as novas funções. Você pode até renderizar a página de maneira diferente.
Emad
Supondo que você esteja usando cookie ou token de portador jwt: as reivindicações / funções do usuário persistem no cookie / token, é necessário sair do usuário e entrar novamente no usuário para garantir que ele receba um cookie / token novo.
itminus 7/11/19
Olá, @itminus Atualmente, a fase inicial está em execução, portanto, no momento do login, o usuário obtém a lista de funções e funções disponíveis Create Employee, View Employeecomo @Emad Sim. Preciso de alterações no momento do login, se houver alguma alteração durante a sessão ao vivo. afetar em um papel. É possível?
Deep Soni
@DeepSoni podemos implementar atributos de autorização personalizados para que possamos atender a esse requisito. Por favor, sugira para que possamos seguir em frente.
Siddique Jishan

Respostas:

1

Esta é uma pergunta complicada e não há uma resposta certa, mas existem várias maneiras de fazê-lo. Primeiro, assumirei que você está usando autenticação sem estado usando uma declaração baseada em declarações. A maneira mais simples é escrever sua própria política que lerá as funções de usuário antes de cada solicitação; essa é a maneira mais simples de fazer isso e a implementação mais rápida.

internal class DatabaseRoles : IAuthorizationRequirement
    {
        public string Role { get; }

        public DatabaseRoles(string role)
        {
            Role = role;
        }
    }

    internal class DatabaseRolesHandler : AuthorizationHandler<DatabaseRoles>
    {
        private readonly UserManager<IdentityUser> userManager;

        public DatabaseRolesHandler(UserManager<IdentityUser> userManager, RoleManager<IdentityRole> roleManager)
        {
            this.userManager = userManager;
        }

        protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, DatabaseRoles requirement)
        {
            //NOTE this is the out of the box implementation of roles and simple query to get the roles from the EF backed database. I would recoment makeing a custom privelages store for this and not using roles for this but access rights
            var user = await userManager.FindByIdAsync(userManager.GetUserId(context.User));
            if (await userManager.IsInRoleAsync(user, requirement.Role))
            {
                context.Succeed(requirement);
            }
        }

    }

Mas essa solução não tem esse desempenho porque requer uma chamada ao banco de dados em cada solicitação. Isso é bom em pequenas cargas, mas pode criar problemas no tráfego. A outra maneira é reavivar todos os tokens de usuário quando as funções mudam, mas isso é super complicado. Tenho certeza de que, se você criar algum armazenamento de acesso rápido para funções como redis, não haverá problemas para verificar todas as chamadas. Também não recomendo criar seu próprio armazenamento de usuário, pois é um pesadelo manter e manter-se atualizado em relação aos padrões de segurança.

Filip Cordas
fonte
Oi, obrigado pela sua resposta. Eu tentei com a sua solução, mas em todo processamento do Index, Create, Edit ou Qualquer outra operação que este método está chamando e um problema é: se houver um painel, houver público disponível, não há função atribuída a esse módulo em particular; visível para qualquer pessoa conforme seu código.
Deep Soni
@DeepSoni Apenas uma coisa para apontar o código, se a demonstração não recomendar o uso como está. Você deve personalizar isso para atender às suas necessidades. O ponto disso é como exemplo de autenticação baseada em recursos . A consulta deve verificar seu banco de dados com o ID do usuário com uma consulta personalizada.
Filip Cordas
Obrigado pela resposta. Deixe-me tentar com sua referência e solução.
Profundo Soni
Atualmente, tento fazer referência ao Microsoft Doc para obter autorização baseada em recursos e IDocumentRepositorynão poder usá-lo. mostra-me para instalar o UmbracoCMS. Você pode descobrir?
Deep Soni
Então, é uma pergunta específica do UmbracoCMS. Na verdade, não estou familiarizado com isso; talvez seja melhor adicionar a tag e o código do UmbracoCMS que você tentou fazer para alguém com experiência para analisá-lo. Mas, pelo que sei, deve funcionar em qualquer lugar, desde que você faça a consulta correta para o UmbracoCMS.
Filip Cordas
-1

Se você estiver usando Session / Cookie para armazenar os detalhes do usuário conectado, poderá esvaziá-los sempre que o Admin fizer alterações na função. Em todas as ações, você pode verificar a função em Session / Cookie e seguir em frente. Agora, assim que o usuário clicar em qualquer lugar na tela que atinja o controlador. A condição será verificada e o usuário será desconectado, pois o objeto Session / Cookie está vazio.

Bansari Soni
fonte
Olá, @BansariSoni. Obrigado pela resposta. Não faz sentido remover a sessão todas as vezes e solicitar o login do usuário. Como apenas um patch (Fixo) no aplicativo, você precisa de uma resposta adequada que seja aceitável ou de uma dica para descobrir a resposta.
Deep Soni
Se o papel estiver na sessão, de acordo com mim, somente duas opções poderão ser alteradas ou removidas. Aqui você pode fazer outra coisa, como quando o administrador muda de função, você pode verificar se esse ID do usuário existe na sessão, se sim, e depois definir um sinalizador na sessão. Em seguida, você pode criar um trabalho cron que atualiza a página a cada 5 minutos apenas se esse sinalizador específico for verdadeiro.
Bansari Soni 19/11/19