คุณลักษณะ Role Manager ไม่ได้เปิดใช้งาน


192

มีProviderExceptionต่อไปนี้:

คุณลักษณะ Role Manager ไม่ได้เปิดใช้งาน

จนถึงตอนนี้ดีมาก

มีวิธีใดบ้างที่สามารถเรียกให้ตรวจสอบว่า Role Manager เปิดใช้งานหรือไม่

คำตอบ:


302

คุณสามารถทำได้โดยอ่านจากคุณสมบัติบูลีนที่:

System.Web.Security.Roles.Enabled

นี่คือการอ่านโดยตรงจากenabledแอตทริบิวต์ของroleManagerองค์ประกอบในweb.config:

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


อัปเดต:
สำหรับข้อมูลเพิ่มเติมลองดูตัวอย่าง MSDN นี้: https://msdn.microsoft.com/en-us/library/aa354509(v=vs.110).aspx


1
ฉันจะทำสิ่งนี้จากรหัสแทนได้web.configอย่างไร ฉันลองใส่เข้าไปApplication_Startแล้วก็บอกว่าThis method can only be called during the application's pre-start initialization phase.
Maslow

1
สิ่งนี้จะไปใน web.config?
Matt Connolly

17
หลังจากเพิ่มข้างต้นเพื่อ web.config roleManager เปิดใช้งาน แต่ตอนนี้ฉันได้รับการยกเว้นUnable to connect to SQL Server database
Irfan Yusanif

2
@ ข้อผิดพลาด "ไม่สามารถเชื่อมต่อกับฐานข้อมูล SQL Server" ได้
แจ็ค

2
ว้าวนี่เป็นคำตอบที่ยอดเยี่ยมฉันไม่ต้องตั้งค่าอะไรเลยใช้งานได้เหมือนมีเสน่ห์ เมื่อกำหนดค่าใน web.config ฉันสามารถตรวจสอบ User.Identity.IsAuthenticated เพื่อดูว่าผู้ใช้เข้าสู่ระบบมีการรับรองความถูกต้อง asp.net ดังนั้นเย็น
Quan

52

หากคุณมาที่นี่เพราะคุณกำลังใช้สิ่งใหม่ASP.NET Identity UserManagerสิ่งที่คุณต้องการคือRoleManager:

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

roleManager จะให้สิทธิ์การเข้าถึงแก่คุณเพื่อดูว่ามีบทบาทสร้าง ฯลฯ รวมถึงบทบาทที่สร้างขึ้นสำหรับ UserManager


73
เด็ก 3 ขวบต้องทำอะไรกับอะไร ฉันถูกนำไปที่โพสต์นี้จาก Google เพราะฉันกำลังจัดการกับปัญหาการตั้งค่า Identity เนื่องจากฉันคิดออก ... คนต่อไปที่จัดการกับปัญหาเดียวกันกับฉันที่ได้รับมาที่นี่โดย Google จะรู้ว่าจะทำอย่างไร ...
Serj Sagan

1
นอกจากนี้ Identity UserManager ยังมีคุณสมบัติที่มีประโยชน์ในการรับบทบาทสำหรับผู้ใช้ที่กำหนด: UserManager.GetRolesAsync (User.Identity.GetUserId ());
keithl8041

คุณใส่ var roleManager = ใหม่ RoleManager <IdentityRole> (ใหม่ RoleStore <IdentityRole> (ใหม่ ApplicationDbContext ())); ?
Mario M

คุณสามารถทำได้ทุกที่ในแอป คุณจะต้องแก้ไขการอ้างอิงบางอย่าง แต่ทุกที่ที่คุณต้องการบทบาทในแอพ Identity คุณสามารถใช้คำสั่งนี้ได้
Serj Sagan

11

ฉันพบข้อเสนอแนะ 2 ที่อื่นผ่านทาง Google ที่แนะนำ a) ตรวจสอบให้แน่ใจว่าการเชื่อมต่อฐานข้อมูลของคุณ (อันที่ใช้งานอยู่) ถูกต้องและกุญแจสำคัญในการสะกดถูกต้องและ b) ที่ตั้งค่าสถานะ Enabled บน RoleManager เป็นจริง หวังว่าหนึ่งในนั้นจะช่วย มันทำเพื่อฉัน

คุณลองตรวจสอบบทบาทเปิดใช้งานหรือไม่ นอกจากนี้คุณสามารถตรวจสอบ Roles.Providers เพื่อดูจำนวนผู้ให้บริการที่มีอยู่และคุณสามารถตรวจสอบ Roles.Provider สำหรับผู้ให้บริการเริ่มต้น ถ้ามันเป็นโมฆะก็ไม่มีสักอัน


ขอบคุณสำหรับคำตอบ แต่มันไม่ใช่สิ่งที่ฉันต้องการ ฉันต้องการวิธีที่ตรวจสอบว่าเปิดใช้งานคุณลักษณะ Role Manager หรือไม่โดยไม่มีการแคช ProviderException สำหรับจุดประสงค์นั้น
gsharp

8

ฉันพบคำถามนี้เนื่องจากข้อยกเว้นที่กล่าวถึงในนั้น Web.Config ของฉันไม่มี<roleManager>แท็กใด ๆ ฉันรู้ว่าแม้ว่าฉันจะเพิ่ม (ตามInfotekka แนะนำ ) มันก็ลงเอยด้วยการยกเว้นฐานข้อมูล หลังจากทำตามคำแนะนำในคำตอบอื่น ๆ ที่นี่ไม่มีใครแก้ปัญหาได้อย่างสมบูรณ์

เนื่องจากแท็ก Web.Config เหล่านี้สามารถสร้างขึ้นได้โดยอัตโนมัติจึงรู้สึกผิดที่จะแก้ไขด้วยการเพิ่มแท็กด้วยตนเอง หากคุณอยู่ในกรณีที่คล้ายกันให้ยกเลิกการเปลี่ยนแปลงทั้งหมดที่คุณทำกับ Web.Config และ Visual Studio:

  1. กด Ctrl + Qพิมพ์nugetแล้วคลิกที่ "จัดการแพคเกจ NuGet";
  2. กดCtrl+ Eพิมพ์ผู้ให้บริการและในรายการควรแสดง "Microsoft ASP.NET Universal Providers Core Core " และ "Microsoft ASP.NET Universal Providers สำหรับ LocalDB " (ทั้งโดย Microsoft)
  3. คลิกที่ปุ่มติดตั้งทั้งคู่และปิดหน้าต่าง NuGet
  4. ตรวจสอบ Web.config ของคุณและตอนนี้คุณควรมีอย่างน้อยหนึ่ง<providers>แท็กในโปรไฟล์ , สมาชิก , แท็กSessionStateและภายในแท็กRoleManagerใหม่เช่นนี้:

    <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. เพิ่มenabled="true"เช่น:

    <roleManager defaultProvider="DefaultRoleProvider" enabled="true">
  6. กด F6เพื่อสร้างและตอนนี้มันควรจะตกลงเพื่อดำเนินการปรับปรุงฐานข้อมูลโดยไม่ต้องมีข้อยกเว้น:

    1. กดCtrl+Qพิมพ์ตัวจัดการ , คลิกที่ "Package Manager Console";
    2. ชนิด update-database -verboseและเมธอด Seed จะทำงานได้ดี (ถ้าคุณไม่ได้ยุ่งที่อื่น) และสร้างตารางในฐานข้อมูลของคุณ
    3. กดCtrl+ W+ Lเพื่อเปิดเซิร์ฟเวอร์ Explorer และคุณควรจะสามารถตรวจสอบในการเชื่อมต่อข้อมูล> DefaultConnection> ตารางบทบาทและUsersInRolesตารางระหว่างตารางที่สร้างขึ้นใหม่!

1
" เนื่องจากฟิลด์ Web.Config ถูกสร้างขึ้นโดยอัตโนมัติ " นี่ไม่ถูกต้องทั้งหมด ในขณะที่แพ็คเกจ NuGet จำนวนมากจะปรับเปลี่ยนไฟล์ปรับแต่งโดยอัตโนมัติ แต่ก็ไม่มีกฎชุดที่กำหนดให้ทำ
Kevin R.

มันสมบูรณ์แบบ ขอบคุณ
sapatelbaps

6

หากคุณกำลังใช้ASP.NET Identity UserManagerคุณสามารถได้รับเช่นนี้เช่นกัน:

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

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

หากคุณเปลี่ยนคีย์สำหรับผู้ใช้จาก Guid เป็น Int เช่นใช้รหัสนี้:

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

สิ่งนี้ใช้ได้สำหรับฉัน โปรดพูดว่าทำไมถ้าคุณลงคะแนน
Ogglas

สิ่งนี้ใช้ไม่ได้เพราะคุณจำเป็นต้องส่งหมายเลขผู้ใช้ไปยัง int เช่น: userManager.GetRoles (Convert.ToInt32 (User.Identity.GetUserId <int> ());
ของเล่น

@toy ไม่ <int> จะได้รับค่าเป็น int ไม่จำเป็นต้องแปลง แน่นอนว่าการทำเช่นนี้ในการทำงานรหัสประจำตัวจะต้องเป็นแบบ 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

นี่คือรหัสที่คุณต้องใส่ใน Account Controller ของคุณใน MVC5 และใหม่กว่าเพื่อรับรายการบทบาทของผู้ใช้:

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

ไม่จำเป็นต้องใช้Roles.GetRolesForUser()และเปิดใช้งานคุณสมบัติตัวจัดการบทบาท

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.