2013-11-21 17 views
18

Tôi có ứng dụng ASP.NET MVC 5. Tôi đang sử dụng nhà cung cấp tiêu chuẩn ASP.NET Identity để quản lý vai trò và người dùng. Điều quan trọng là tôi đang sử dụng IdentityUser từ một dự án kho lưu trữ riêng, nhưng điều này có vẻ ổn. Tôi có thể đăng ký, đăng nhập, chỉnh sửa người dùng và quản lý vai trò của họ.Vai trò người dùng kiểm tra nhận dạng ASP.NET không hoạt động

tôi thêm người sử dụng vai trò với những dòng này:

UserManager.AddToRole(userdetail.Id, r); 
db.Entry(userdetail).State = EntityState.Modified; 
db.SaveChanges(); 

này dường như làm việc ở mức DB.

Nhưng, tôi không thể sử dụng xác thực dựa Vai trò, thực sự là simples

HttpContext.User.IsInRole("Administrator") 

không làm việc quá.

[Authorize(Roles="Administrator")] 

cũng không hoạt động.

tôi có thể kiểm tra chỉ với phương pháp này, cho dù người sử dụng là một quản trị viên:

UserManager.IsInRole(userID, "Administrator"). 

Tại sao?

Trong mọi hướng dẫn tôi tìm thấy, mọi thứ đều hoạt động tốt. Kho dự án khác nhau có thể là lý do? Hoặc ASP.NET Identity bị hỏng rất nhiều?

Vui lòng tư vấn,

+3

Tôi gặp vấn đề tương tự. Bất kì giải pháp nào? – janhartmann

+0

Câu trả lời đã được đăng. Chấp nhận nó. Cái của jd4u. – DtechNet

Trả lời

13

Có vẻ như có vấn đề.[Vấn đề do thiết kế]

  • Tên vai trò là trường hợp nhạy cảm trong AuthorizeAttribute và User.IsInRole
  • Tên vai trò là trường hợp nhạy cảm trong UserManager.IsInRole

Hơn nữa, kiểm tra tên vai trò chính xác được sử dụng để xác minh.

[Ở trên dựa trên thử nghiệm được thực hiện với mã bên dưới. Vai trò Name = "Quản trị", người dùng được thêm vào vai trò "Quản trị".]

[Authorize(Roles="Admin")] /*True as "Admin" has A capital as entered in Role name*/ 
public ActionResult Secured() 
{ 
    if (User.IsInRole("admin")) /*This is False*/ 
    { 
     Console.WriteLine("In"); 
    } 
    if(UserManager.IsInRole(User.Identity.GetUserId(), "admin")) /*This is True!!*/ 
    { 
     Console.WriteLine("In"); 
    } 
    return View(); 
} 

Nếu chúng ta thay đổi thuộc tính để [Authorize(Roles="admin")], nó chuyển hướng đến trang đăng nhập.

+0

Bạn có biết làm thế nào để bỏ qua nguyên nhân này tôi có cùng một vấn đề chính xác. Tôi sử dụng tùy chỉnh người dùng và rolestore nhưng im đoán nên được lưu ý nhưng nó hoạt động tốt bằng cách sử dụng người quản lý và không thông qua người dùng và chú thích. – Baserz

+0

Điều này đã cứu mạng tôi Tôi không biết tại sao câu trả lời này không được chấp nhận. Không có gì khác đề cập đến điều này. Tìm kiếm "Identity userinrole" trên Google và bạn sẽ thấy "User.IsInRole" không chính xác <- không hoạt động !! Chắc chắn họ là những câu hỏi cũ và ASP.NET MVC 5 là 2 tuổi bây giờ nhưng oh tốt. Nếu có ai lập trình bản gốc MVC 5, thì đây là nó! Có lẽ làm việc cho NET CORE quá. – DtechNet

+0

Trường hợp nhạy cảm trong điều này chỉ là tội phạm, nó phải là một lỗi. Tôi tìm thấy điều này trong mã của riêng tôi và chỉ tìm thấy câu trả lời này sau khi lãng phí một đoạn thời gian tốt đẹp. Upticking câu trả lời của bạn! –

0

Bạn có mục này trong web.config không?

<roleManager enabled="true"> 
     <providers> 
      <clear /> 
      <add connectionStringName="ApplicationServices" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" applicationName="/" /> 
     </providers> 
    </roleManager> 

Ngoài ra, nếu tôi nhớ chính xác, có một không gian tên khác cho tổ chức cung cấp vai trò trong các phiên bản .NET khác nhau.

+9

Bạn đang nói về ASP.NET MVC 5 mới nhất với ASP.NET Identity? – martonx

22

Trong trường hợp đó, bạn cần phải đăng xuất và đăng nhập lại người dùng.

Vì dữ liệu vai trò cũng được lưu trữ trong cookie, Vì vậy, bạn phải phát hành lại cookie để làm việc đó.

+2

Bạn cũng có thể đạt được điều tương tự mà không phải đăng nhập người dùng vào và ra lần nữa bằng cách cập nhật tem bảo mật. Xem http://stackoverflow.com/a/19505060/110871 – Funka

+1

câu trả lời hay ... –

Các vấn đề liên quan