O recurso Gerenciador de Funções não foi ativado


192

Obteve a seguinte ProviderException :

O recurso Gerenciador de Funções não foi ativado.

Por enquanto, tudo bem.

Existe algum método que possa ser chamado para verificar se o Gerenciador de Funções foi ativado ou não?

Respostas:


302

Você pode fazer isso lendo a propriedade booleana em:

System.Web.Security.Roles.Enabled

Esta é uma leitura direta do enabledatributo do roleManagerelemento no web.config:

<configuration>
  <system.web>
    <roleManager enabled="true" />
  </system.web>
</configuration>


Atualização: para
obter mais informações, consulte este exemplo do MSDN: https://msdn.microsoft.com/en-us/library/aa354509(v=vs.110).aspx


1
como posso fazer isso a partir do código em vez de web.config? Eu tentei colocá-lo em Application_Starte ele dizThis method can only be called during the application's pre-start initialization phase.
Maslow

1
Para onde isso vai no web.config?
Matt Connolly

17
Depois de adicionar acima, o web.config roleManager está ativado. Mas agora estou recebendo exceçãoUnable to connect to SQL Server database
Irfan Yusanif

2
@Infotekka Erro "Não foi possível conectar ao banco de dados do SQL Server".
Jack

2
uau, esta é uma ótima resposta, eu nem preciso configurar nada, apenas funciona como um encanto. Depois de configurado no web.config, posso apenas verificar User.Identity.IsAuthenticated para ver se um usuário de logon está autenticado. Tão legal asp.net
Quan

52

Se você chegou aqui porque está usando o novo ASP.NET Identity UserManager, o que está procurando é o seguinte RoleManager:

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

roleManager lhe dará acesso para ver se a função existe, cria etc., além de ser criada para o UserManager


73
O que a criança de 3 anos tem a ver com alguma coisa? Fui levado a esta postagem do Google porque estava lidando com um problema ao configurar o Identity. Desde que eu percebi isso ... a próxima pessoa lidando com o mesmo problema que eu, que fica trazido aqui por Google vai saber o que fazer ...
Serj Sagan

1
Além disso, o Identity UserManager possui um recurso útil para obter funções para o usuário especificado: UserManager.GetRolesAsync (User.Identity.GetUserId ());
keithl8041

Onde você coloca var roleManager = new RoleManager <IdentityRole> (novo RoleStore <IdentityRole> (novo ApplicationDbContext ())); ?
1913 Mario M

Você pode fazer isso em qualquer lugar do aplicativo. Obviamente, você precisará resolver algumas referências, mas em qualquer lugar em que precisar de funções em um aplicativo de identidade, você pode usar esta declaração.
Serj Sagan

11

Encontrei 2 sugestões em outro lugar do Google que sugeriam a) garantir que a cadeia de conexão db (a que as Funções estão usando) esteja correta e que a chave esteja escrita corretamente eb) que o sinalizador Ativado no RoleManager esteja definido como verdadeiro. Espero que uma dessas ajudas. Isso fez por mim.

Você tentou verificar Roles.Enabled? Além disso, você pode verificar o Roles.Providers para ver quantos fornecedores estão disponíveis e o Roles.Provider para o provedor padrão. Se for nulo, não há um.


Obrigado pela resposta. Mas não é o que eu quero. Eu quero um método que verifique se o recurso Gerenciador de Funções está ativado ou não, sem armazenar em cache a ProviderException para esse fim.
gsharp

8

Encontrei essa pergunta devido à exceção mencionada nela. Meu Web.Config não tinha nenhuma <roleManager>tag. Percebi que, mesmo que eu o adicionasse (como sugeriu Infotekka ), ele acabou sendo uma exceção do banco de dados. Depois de seguir as sugestões das outras respostas aqui, nenhuma resolveu completamente o problema.

Como essas tags Web.Config podem ser geradas automaticamente, parecia errado resolvê-las adicionando-as manualmente. Se você estiver em um caso semelhante, desfaça todas as alterações feitas no Web.Config e no Visual Studio:

  1. Pressione Ctrl+ Q, digite nuget e clique em "Gerenciar pacotes NuGet";
  2. Pressione Ctrl+ E, digite provedores e, na lista, deve aparecer " Bibliotecas principais do Microsoft ASP.NET Universal Providers " e "Provedores universais do Microsoft ASP.NET para LocalDB " (ambos criados pela Microsoft);
  3. Clique no botão Instalar nos dois e feche a janela do NuGet;
  4. Verifique seu Web.config e agora você deve ter pelo menos uma <providers>marca dentro das marcas Profile , Membership , SessionState e também dentro da nova marca RoleManager , assim:

    <roleManager defaultProvider="DefaultRoleProvider">
        <providers>
           <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=NUMBER" connectionStringName="DefaultConnection" applicationName="/" />
        </providers>
    </roleManager>
    
  5. Adicione enabled="true"assim:

    <roleManager defaultProvider="DefaultRoleProvider" enabled="true">
  6. Pressione F6para criar e agora não há problema em prosseguir para uma atualização do banco de dados sem a exceção:

    1. Pressione Ctrl+ Q, digite manager , clique em "Package Manager Console";
    2. Digite update-database -verbosee o método Seed funcionará bem (se você não mexeu em outro lugar) e criará algumas tabelas no seu banco de dados;
    3. Pressione Ctrl+ W+ Lpara abrir o Server Explorer e você poderá verificar em Data Connections> DefaultConnection> Tables as funções e UsersInRoles entre as tabelas recém-criadas!

1
" Como os campos Web.Config são gerados automaticamente " Isso não está totalmente correto. Enquanto muitos pacotes NuGet ajustam automaticamente os arquivos de configuração, não há uma regra definida exigindo que eles o façam.
Kevin R.

Isto é perfeito. Thnx
sapatelbaps 5/02/19

6

Se você estiver usando, ASP.NET Identity UserManagertambém pode obtê-lo assim:

var userManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>();

var roles = userManager.GetRoles(User.Identity.GetUserId());

Se você alterou a chave do usuário de Guid para Int, por exemplo, use este código:

var roles = userManager.GetRoles(User.Identity.GetUserId<int>());

Isso funcionou para mim. Por favor, diga por que se você está votando para baixo.
Ogglas

isso não funciona porque você precisa converter userid para int de tal modo que: userManager.GetRoles (Convert.ToInt32 (User.Identity.GetUserId <int> ()));
toy

@toy Não, <int> receberá o valor como int. Não há necessidade de converter. Obviamente, para que isso funcione, a chave de identidade precisa ser int.
Ogglas

-1
<roleManager
  enabled="true"
  cacheRolesInCookie="false"
  cookieName=".ASPXROLES"
  cookieTimeout="30"
  cookiePath="/"
  cookieRequireSSL="false"
  cookieSlidingExpiration="true"
  cookieProtection="All"
  defaultProvider="AspNetSqlRoleProvider"
  createPersistentCookie="false"
  maxCachedResults="25">
  <providers>
    <clear />
    <add
       connectionStringName="MembershipConnection"
       applicationName="Mvc3"
       name="AspNetSqlRoleProvider"
       type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <add
       applicationName="Mvc3"
       name="AspNetWindowsTokenRoleProvider"
       type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </providers>
</roleManager>

-1

Aqui está o código que você precisa colocar no seu Controlador de conta no MVC5 e posterior para obter a lista de funções de um usuário:

csharp public async Task<ActionResult> RoleAdd(string UserID) { return View(await UserManager.GetRolesAsync(UserID)).OrderBy(s => s).ToList()); }

Não há necessidade de usar Roles.GetRolesForUser()e ativar o recurso Gerenciador de funções.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.