2009-08-14 54 views
7

Tôi đang làm việc để thêm ủy quyền cho một ứng dụng ASP.NET MVC và đã chạy vào một khối đường. Cuối cùng tôi đã có thể nhận được nhà cung cấp tư cách thành viên tùy chỉnh của chúng tôi có dây và nhận được xác thực làm việc cho Ứng dụng. Bây giờ, như mong đợi, nếu tôi thêm thuộc tính [Authorize] vào bộ điều khiển của tôi, người dùng phải được xác thực để xem trang. Tôi cũng đã thử nghiệm thành công [Ủy quyền (Người dùng = "{tên người dùng}")] cũng hoạt động để hạn chế trang đối với người dùng cụ thể đó.HttpContext.Current.User.IsInRole (roleName) luôn trả về false

Vấn đề là [Ủy quyền (Vai trò = "{RoleName}")] dường như không hoạt động như tôi mong đợi. Nếu tôi thêm thuộc tính đó vào bộ điều khiển, bất cứ khi nào tôi cố truy cập trang tương ứng, tôi sẽ được chuyển hướng đến trang đăng nhập của chúng tôi. Đây là những gì tôi mong đợi sẽ xảy ra nếu người dùng không có vai trò cần thiết, nhưng nó đang xảy ra ngay cả khi người dùng có vai trò đó. Tôi đã kiểm tra cả User.IsInRole ("{roleName}") và HttpContext.Current.User.IsInRole ("{roleName}") trong một View, một Controller và một phương thức của trình trợ giúp và điều này luôn trả về 'False'.

Tôi đã xác minh rằng người dùng mà tôi đang làm việc có vai trò mà tôi đang cố gắng ủy quyền. Tôi cũng đã thử nghiệm những người dùng này trong một ứng dụng WebForms hạn chế quyền truy cập trang bởi các vai trò giống nhau và nó hoạt động tốt. Tôi nghĩ rằng tôi có thứ gì đó sai ở đâu đó hoặc thiếu cái gì đó đơn giản, nhưng sau khi tìm kiếm tất cả các buổi sáng, tôi không tìm thấy bất cứ thứ gì giúp tôi gần hơn với giải pháp, vì vậy tôi hy vọng ai đó ở đây có thể giúp tôi.

+0

Xin chào, bạn có thể chỉnh sửa câu trả lời của mình để cho chúng tôi biết cấu hình - có thể giúp những người khác trong tương lai. – sirrocco

+0

sirrocco - cài đặt cấu hình cụ thể cho việc triển khai và môi trường của chúng tôi để chúng không được sử dụng cho bất kỳ ai khác. – Hamman359

+0

Nhận xét của bạn nhắc tôi kiểm tra lại web.config và tôi phát hiện ra rằng nút roleManager đã bật = "false". Tôi chỉ muốn mọi người biết rằng nếu nó bị vô hiệu hóa nó trả về false cho IsInRole như trái ngược với việc trả lại một ngoại lệ của một số loại như bạn có thể mong đợi. –

Trả lời

4

Đầu tiên: sử dụng profiler và khi thực hiện dòng HttpContext.Current.User.IsInRole ("{roleName}"), hãy kiểm tra truy vấn sql là gì.

Nếu không tạo truy vấn thì bạn có thể có cacheRolesInCookie = "true" và IsInRole sẽ kiểm tra FormsAuthenticationTicket cho UserData. Hãy chắc chắn rằng khi bạn tạo FormsAuthenticationTicket, bạn đặt tham số userdata thành chuỗi được phân tách bằng dấu phẩy với vai trò của người dùng.

+0

Cảm ơn, điều này đã không giải quyết vấn đề, nhưng nó đã dẫn tôi xuống một con đường mà cuối cùng đã làm. Nó chỉ ra rằng có một số cài đặt cấu hình thêm cần thiết để có được nhà cung cấp vai trò làm việc đầy đủ mà không có ai làm phiền để cho tôi biết về. Khi tôi vấp phải những thứ đó, mọi thứ 'kỳ diệu' bắt đầu hoạt động. – Hamman359

+1

đó là gì, tôi có cùng một vấn đề, bạn có thể vui lòng cho tôi biết –

0

Thử xóa bộ nhớ cache cookie của trình duyệt của bạn. Tôi đã dành một thời gian đập đầu vào một vấn đề tương tự, và thanh toán bù trừ cookie của tôi giải quyết được vấn đề.

0

Trong trường hợp những người khác tìm thấy câu hỏi này:

Tôi gặp phải vấn đề tương tự và sự cố là khoảng trống trong nhóm miền. Sử dụng bất kỳ số tiền trả về HttpContext.Current.User, các cuộc gọi tới IsInRole() dường như so sánh bằng cách sử dụng tên nhóm trước Windows 2000 không chứa khoảng trắng.

Trong trường hợp của tôi tước các khoảng trắng từ tên nhóm được chuyển đến IsInRole() khắc phục sự cố.

Dưới đây là một phương pháp mở rộng thuận tiện để làm điều này:

/// <summary> 
/// Removes all spaces from a string 
/// </summary> 
/// <param name="value">The string</param> 
/// <returns>The string without spaces</returns> 
public static string StripSpaces(this string value) 
{ 
    // my test using both long and short strings showed StringBuilder 
    // to be slightly faster at this than string.Replace() 

    StringBuilder b = new StringBuilder(value); 

    b.Replace(" ", string.Empty); 

    return b.ToString(); 
} 

Hoặc bạn có thể sử dụng System.DirectoryServices.AccountManagement.UserPrincipal và gọi IsMemberOf() mà nên làm việc tốt hơn với các nhóm tên miền chứa khoảng trắng.

2

Tôi đã có một vấn đề tương tự như OP. Mặc dù đây là một bài viết cũ, tôi nghĩ rằng tôi sẽ đặt những gì làm việc cho tôi. Những gì tôi thấy là nhà cung cấp vai trò đã bị vô hiệu hóa trong web.config. Tôi đặt được bật thành true và nó đã giải quyết được sự cố của tôi.

<configuration> 
    <system.web> 
     <roleManager enabled="true" defaultProvider="myRoleProvider"> 
+0

Yup, lol, đã làm điều đó. Tất cả những giải pháp phức tạp này và hóa ra lại là một công tắc đơn giản. Cảm ơn. –

1

Một chút một chủ đề cũ, nhưng tôi đã có một vấn đề tương tự và nguyên nhân là trong:

FormsAuthentication.SetAuthCookie(string, bool) 

Tôi đã sử dụng thẻ nhận dạng người dùng (Guid) như tham số đầu tiên, kể từ khi mã Tôi đã làm việc với sử dụng một biến có tên là token, nhưng trong thực tế nó phải là một tên người dùng hợp lệ. Tôi tìm thấy điều này sau khi sử dụng profiler và chạy proc được lưu trữ của aspnetdb theo cách thủ công. Tài liệu MSDN cũng xác nhận điều này.

Điều này cũng làm cho [Authorize(Roles="rolename")] thất bại, ngay cả khi người dùng có vai trò, mặc dù [Authorize] hoạt động.

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