Fitur Manajer Peran belum diaktifkan

192

Dapatkan ProviderException berikut :

Fitur Manajer Peran belum diaktifkan.

Sejauh ini baik.

Apakah ada metode yang dapat dipanggil untuk memeriksa apakah Manajer Peran telah diaktifkan atau tidak?

gsharp
sumber

Jawaban:

302

Anda dapat melakukan ini dengan membaca dari properti boolean di:

System.Web.Security.Roles.Enabled

Ini adalah pembacaan langsung dari enabledatribut roleManagerelemen di web.config:

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


Pembaruan:
Untuk informasi lebih lanjut, lihat contoh MSDN ini: https://msdn.microsoft.com/en-us/library/aa354509(v=vs.110).aspx

Infotekka
sumber
1
bagaimana saya bisa melakukan ini dari kode bukan web.config? Saya mencoba memasukkannya ke dalam Application_Startdan dikatakanThis method can only be called during the application's pre-start initialization phase.
Maslow
1
Di mana ini pergi di web.config?
Matt Connolly
17
Setelah menambahkan di atas ke web.config roleManager diaktifkan. Tapi sekarang saya mendapat pengecualianUnable to connect to SQL Server database
Irfan Yusanif
2
@Infotekka kesalahan "Tidak dapat terhubung ke database SQL Server".
Jack
2
wow, ini jawaban yang bagus, saya bahkan tidak perlu mengkonfigurasi apa pun, hanya bekerja seperti pesona. Setelah dikonfigurasi di web.config, saya hanya dapat memeriksa User.Identity.IsAutenticated untuk melihat apakah pengguna login dikonfirmasi. So cool asp.net
Quan
52

Jika Anda sampai di sini karena Anda menggunakan yang baru ASP.NET Identity UserManager, yang sebenarnya Anda cari adalah RoleManager:

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

roleManager akan memberi Anda akses untuk melihat apakah peran itu ada, buat, dll, plus peran itu dibuat untuk UserManager

Serj Sagan
sumber
73
Apa hubungannya anak berusia 3 tahun dengan apa saja? Saya dibawa ke pos ini dari Google karena saya berurusan dengan masalah pengaturan Identity. Karena saya sudah mengetahuinya ... orang berikutnya yang berurusan dengan masalah yang sama dengan saya yang dibawa ke sini oleh Google akan tahu apa yang harus dilakukan ...
Serj Sagan
1
Juga, Identity UserManager memiliki fitur yang berguna untuk mendapatkan peran bagi pengguna yang diberikan: UserManager.GetRolesAsync (User.Identity.GetUserId ());
keithl8041
Di mana Anda meletakkan var roleManager = RoleManager baru <IdentityRole> (RoleStore baru <IdentityRole> (ApplicationDbContext baru ())); ?
Mario M
Anda dapat melakukannya di mana saja di aplikasi. Anda jelas perlu menyelesaikan beberapa referensi, tetapi di mana pun Anda membutuhkan peran dalam aplikasi Identity, Anda dapat menggunakan pernyataan ini.
Serj Sagan
11

Saya menemukan 2 saran di tempat lain melalui Google yang menyarankan a) memastikan db connectionstring Anda (salah satu yang menggunakan Peran) sudah benar dan bahwa kunci untuk itu dieja dengan benar, dan b) bahwa bendera Diaktifkan pada RoleManager disetel ke true. Semoga salah satu dari itu membantu. Itu untuk saya.

Apakah Anda mencoba memeriksa Peran. Diaktifkan? Juga, Anda dapat memeriksa Peran. Penyedia untuk melihat berapa banyak penyedia yang tersedia dan Anda dapat memeriksa Peran. Penyedia untuk penyedia default. Jika nol maka tidak ada.

Daftar pengguna baru
sumber
Terima kasih atas jawabannya. Tapi bukan itu yang saya inginkan. Saya ingin metode yang memeriksa jika fitur Peran Manajer diaktifkan atau tidak, tanpa caching ProviderException untuk tujuan itu.
gsharp
8

Saya menemukan pertanyaan ini karena pengecualian yang disebutkan di dalamnya. Web.Config saya tidak memiliki <roleManager>tag. Saya menyadari bahwa meskipun saya menambahkannya (seperti yang disarankan Infotekka ), itu berakhir dengan pengecualian Database. Setelah mengikuti saran di jawaban lain di sini, tidak ada yang sepenuhnya menyelesaikan masalah.

Karena tag Web.Config ini dapat dibuat secara otomatis, rasanya salah untuk menyelesaikannya dengan menambahkannya secara manual. Jika Anda berada dalam kasus yang sama, batalkan semua perubahan yang Anda buat ke Web.Config dan di Visual Studio:

  1. Tekan Ctrl+ Q, ketik nuget dan klik "Kelola Paket NuGet";
  2. Tekan Ctrl+ E, ketik penyedia dan dalam daftar itu harus muncul " Perpustakaan Inti Penyedia Universal Microsoft ASP.NET Universal " dan "Penyedia Universal Microsoft ASP.NET untuk LocalDB " (keduanya dibuat oleh Microsoft);
  3. Klik tombol Install di keduanya dan tutup jendela NuGet;
  4. Periksa Web.config Anda dan sekarang Anda harus memiliki setidaknya satu <providers>tag di dalam Profil , Keanggotaan , tag SessionState dan juga di dalam tag RoleManager baru , seperti ini:

    <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. Tambahkan enabled="true"seperti ini:

    <roleManager defaultProvider="DefaultRoleProvider" enabled="true">
  6. Tekan F6untuk Bangun dan sekarang tidak masalah untuk melanjutkan ke pembaruan basis data tanpa pengecualian:

    1. Tekan Ctrl+ Q, ketik manajer , klik "Package Manager Console";
    2. Jenis update-database -verbosedan metode Seed akan berjalan dengan baik (jika Anda belum mengacaukannya di tempat lain) dan membuat beberapa tabel di Database Anda;
    3. Tekan Ctrl+ W+ Luntuk membuka Server Explorer dan Anda harus dapat check-in Data Connections> DefaultConnection> Tabel yang Peran dan UsersInRoles tabel di antara tabel yang baru dibuat!
CPHPython
sumber
1
" Karena Web.Config bidang secara otomatis dihasilkan " Ini tidak sepenuhnya benar. Sementara banyak paket NuGet akan secara otomatis menyesuaikan file konfigurasi, tidak ada aturan yang mengharuskan mereka untuk melakukannya.
Kevin R.
Ini sempurna. Thnx
sapatelbaps
6

Jika Anda menggunakan, ASP.NET Identity UserManagerAnda bisa mendapatkannya seperti ini juga:

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

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

Jika Anda telah mengubah kunci untuk pengguna dari Guid ke Int misalnya, gunakan kode ini:

var roles = userManager.GetRoles(User.Identity.GetUserId<int>());
Ogglas
sumber
Ini berhasil untuk saya. Tolong katakan mengapa jika Anda memilih.
Ogglas
ini tidak berfungsi karena Anda perlu melemparkan userid ke int sedemikian rupa sehingga: userManager.GetRoles (Convert.ToInt32 (User.Identity.GetUserId <int> ()));
mainan
@toy Tidak, <int> akan mendapatkan nilai sebagai int. Tidak perlu dikonversi. Tentu saja agar ini bisa berfungsi Kunci identitas perlu 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>
Michael Goldshmidt
sumber
-1

Berikut adalah kode yang harus Anda masukkan ke dalam Pengontrol Akun Anda di MVC5 dan kemudian untuk mendapatkan daftar peran pengguna:

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

Tidak perlu menggunakan Roles.GetRolesForUser()dan mengaktifkan Fitur Peran Manajer.

Amneu
sumber