Tính năng Trình quản lý vai trò chưa được bật


192

Nhà cung cấp ngoại lệ sau :

Tính năng Trình quản lý vai trò chưa được bật.

Càng xa càng tốt.

Có nơi nào đó một phương thức có thể được gọi để kiểm tra xem Trình quản lý vai trò đã được bật hay chưa?

Câu trả lời:


302

Bạn có thể làm điều này bằng cách đọc từ thuộc tính boolean tại:

System.Web.Security.Roles.Enabled

Đây là phần đọc trực tiếp từ enabledthuộc tính của roleManagerphần tử trong web.config:

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


Cập nhật:
Để biết thêm thông tin, hãy xem mẫu MSDN này: https://msdn.microsoft.com/en-us/l Library / aa354509 (v = vs.110) .aspx


1
Làm thế nào tôi có thể làm điều này từ mã thay vì web.config? Tôi đã thử đặt nó vào Application_Startvà nó nóiThis method can only be called during the application's pre-start initialization phase.
Maslow

1
Điều này diễn ra ở đâu trong web.config?
Matt Connolly

17
Sau khi thêm ở trên vào web.config roleManager được bật. Nhưng bây giờ tôi đang có ngoại lệUnable to connect to SQL Server database
Irfan Yusanif

2
@Infotekka "Không thể kết nối với cơ sở dữ liệu SQL Server".
Jack

2
wow, đây là một câu trả lời tuyệt vời, tôi thậm chí không phải cấu hình bất cứ thứ gì, chỉ hoạt động như một bùa mê. Sau khi được định cấu hình trong web.config, tôi chỉ có thể kiểm tra User.Identity.IsAuthenticated để xem người dùng đăng nhập có được xác thực hay không. Thật tuyệt vời asp.net
Quan

52

Nếu bạn đến đây vì bạn đang sử dụng cái mới ASP.NET Identity UserManager, cái bạn thực sự đang tìm kiếm là RoleManager:

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

roleManager sẽ cung cấp cho bạn quyền truy cập để xem vai trò có tồn tại, tạo, v.v., cộng với vai trò đó được tạo cho UserManager


73
Trẻ 3 tuổi phải làm gì với bất cứ điều gì? Tôi đã nhận được bài đăng này từ Google vì tôi đang xử lý một vấn đề khi thiết lập Danh tính. Vì tôi đã hiểu ra ... người tiếp theo xử lý vấn đề tương tự như tôi được Google đưa đến đây sẽ biết phải làm gì ...
Serj Sagan

1
Ngoài ra, Trình quản lý danh tính có một tính năng hữu ích để nhận các vai trò cho người dùng đã cho: UserManager.GetRolesAsync (User.Identity.GetUserId ());
keithl8041

Nơi nào bạn đặt var RoleManager = new RoleManager <IdentityRole> (new RoleStore <IdentityRole> (new ApplicationDbContext ())); ?
Mario M

Bạn có thể làm điều đó ở bất cứ đâu trong ứng dụng. Rõ ràng bạn sẽ cần giải quyết một số tài liệu tham khảo, nhưng bất cứ nơi nào bạn cần vai trò trong ứng dụng Nhận dạng, bạn có thể sử dụng tuyên bố này.
Serj Sagan

11

Tôi đã tìm thấy 2 đề xuất ở nơi khác thông qua Google gợi ý a) đảm bảo chuỗi kết nối db của bạn (chuỗi mà Roles đang sử dụng) là chính xác và khóa cho nó được viết đúng chính tả và b) rằng cờ Kích hoạt trên Vai trò quản lý được đặt thành đúng. Hy vọng một trong những giúp đỡ. Nó đã làm cho tôi.

Bạn đã thử kiểm tra Roles.Enables chưa? Ngoài ra, bạn có thể kiểm tra Roles.Providers để xem có bao nhiêu nhà cung cấp khả dụng và bạn có thể kiểm tra Roles.Provider cho nhà cung cấp mặc định. Nếu nó là null thì không có.


Cảm ơn bạn đã trả lời. Nhưng đó không phải là điều tôi muốn. Tôi muốn một phương thức kiểm tra xem tính năng Trình quản lý vai trò có được bật hay không, mà không lưu bộ đệm của Nhà cung cấp ngoại lệ cho mục đích đó.
gsharp

8

Tôi tìm thấy câu hỏi này do ngoại lệ được đề cập trong đó. Web.Config của tôi không có bất kỳ <roleManager>thẻ nào . Tôi nhận ra rằng ngay cả khi tôi thêm nó (như Infotekka đã đề xuất ), nó đã kết thúc trong một ngoại lệ Cơ sở dữ liệu. Sau khi làm theo các gợi ý trong các câu trả lời khác ở đây, không ai giải quyết được hoàn toàn vấn đề.

Vì các thẻ Web.Config này có thể được tạo tự động, nên cảm thấy sai khi giải quyết nó bằng cách thêm chúng theo cách thủ công. Nếu bạn ở trong trường hợp tương tự, hãy hoàn tác tất cả các thay đổi bạn đã thực hiện đối với Web.Config và trong Visual Studio:

  1. Nhấn Ctrl+ Q, gõ nuget và nhấp vào "Quản lý gói NuGet";
  2. Nhấn Ctrl+ E, nhập nhà cung cấp và trong danh sách, nó sẽ hiển thị " Thư viện lõi của Microsoft ASP.NET Universal Providers " và "Microsoft ASP.NET Universal Providers cho LocalDB " (cả hai được tạo bởi Microsoft);
  3. Nhấp vào nút Cài đặt trong cả hai và đóng cửa sổ NuGet;
  4. Kiểm tra Web.config của bạn và bây giờ bạn sẽ có ít nhất một <providers>thẻ bên trong các thẻ Hồ sơ , Thành viên , SessionState và bên trong thẻ Vai trò quản lý mới , như thế này:

    <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. Thêm enabled="true"như vậy:

    <roleManager defaultProvider="DefaultRoleProvider" enabled="true">
  6. Nhấn F6để xây dựng và bây giờ sẽ ổn để tiến hành cập nhật cơ sở dữ liệu mà không có ngoại lệ đó:

    1. Nhấn Ctrl+ Q, quản lý loại , nhấp vào "Bảng điều khiển quản lý gói";
    2. Kiểu update-database -verbosevà phương thức Seed sẽ chạy tốt (nếu bạn không bị rối ở nơi khác) và tạo một vài bảng trong Cơ sở dữ liệu của bạn;
    3. Nhấn Ctrl+ W+ Lđể mở Server Explorer và bạn sẽ có thể kiểm tra trong Kết nối dữ liệu> DefaultConnection> Bảng các bảng Vai tròUsersInRoles trong số các bảng mới được tạo!

1
" Vì các trường Web.Config được tạo tự động " Điều này không hoàn toàn chính xác. Mặc dù nhiều gói NuGet sẽ tự động điều chỉnh các tệp cấu hình, nhưng không có quy tắc thiết lập nào yêu cầu chúng làm như vậy.
Kevin R.

Đây là hoàn hảo. Thnx
sapatelbaps

6

Nếu bạn đang sử dụng ASP.NET Identity UserManager bạn cũng có thể có được nó như thế này:

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

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

Nếu bạn đã thay đổi khóa cho người dùng từ Guid sang Int chẳng hạn, hãy sử dụng mã này:

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

Điều này làm việc cho tôi. Hãy nói tại sao nếu bạn đang bỏ phiếu xuống.
Ogglas

điều này không hoạt động vì bạn cần truyền userid thành int sao cho: userManager.GetRoles (Convert.ToInt32 (User.Identity.GetUserId <int> ()));
đồ chơi

@toy Không, <int> sẽ nhận giá trị là int. Không cần chuyển đổi. Tất nhiên để làm việc này, khóa Nhận dạng cần phải là 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

Đây là mã mà bạn cần đặt trong Trình điều khiển tài khoản của mình trong MVC5 và sau đó để có danh sách vai trò của người dùng:

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

Không cần sử dụng Roles.GetRolesForUser()và kích hoạt Tính năng Trình quản lý Vai trò.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.