2010-02-05 33 views
22

Thông thường tôi bảo vệ Tác vụ của mình bằng [Authorize] nhưng lần này tôi cần kiểm tra xem người dùng có được ủy quyền bên trong hành động hay không.Cách kiểm tra xem người dùng có được ủy quyền bên trong Hành động

Ví dụ

if(userIsAuthorized) { 
    //do stuff 
} 
else { 
    //return to login page 
} 

Tôi tin Tôi đang sử dụng 'Forms Authentication'

Câu hỏi này là loại tương tự như this nhưng không ai trong số các câu trả lời cho có vẻ để làm việc.

CHỈNH SỬA: Tôi đã thực hiện thêm một số thao tác - có vẻ như nếu tôi phá vỡ một Hành động có [Authorize], User.Identity được đặt, nhưng trên Hành động không có nó, User.Identity trống, ngay cả khi tôi đã đăng nhập trong

+0

Tôi đã khắc phục sự cố của mình bằng cách sử dụng giải pháp hack-ish, tôi sẽ giả định câu trả lời của bạn là chính xác và đó là do việc thực hiện kỳ ​​lạ của tôi về xác thực rằng mọi thứ thật lạ ... – elwyn

Trả lời

42

Nếu bạn chỉ muốn biết nếu người dùng đang đăng nhập:

if (User.Identity.IsAuthenticated) { ... } 

Nếu bạn đang cố gắng làm bất cứ điều gì vai trò cụ thể:

if (User.IsInRole("Administrators")) { ... } 

Các dụ User là một tài sản công cộng của lớp Controller, vì vậy bạn luôn có quyền truy cập vào nó từ Bộ điều khiển bạn viết. Nếu không có người dùng nào đăng nhập, bạn cần có GenericPrincipal cho số UserGenericIdentity cho số User.Identity, do đó, đừng lo lắng về việc kiểm tra các giá trị rỗng.

+0

Một lần nữa, chỉ cung cấp cho tôi 'true' nếu được sử dụng trong một '[Authorize]' 'd Action – elwyn

+0

@elwyn: Tôi không tin đó là chính xác. Tôi vừa thử nghiệm nó ở đây trên một hành động mà không có thuộc tính '[Authorize]' và 'User.Identity.IsAuthenticated' là' true'. Bạn có chắc chắn rằng phiên thực sự đã đăng nhập khi bạn đang thử nghiệm điều này? – Aaronaught

+0

@Aaronaught Có, chỉ cần tăng gấp đôi (gấp ba lần), đã đăng nhập chắc chắn trong khi thử điều đó và vẫn thấy sai – elwyn

1

Tôi đề nghị trước tiên hãy tìm hiểu xem bạn cho phép sử dụng loại giấy phép nào. ;)

Câu trả lời bạn đã đăng là chính xác. Từ những gì tôi nhớ poking xung quanh thuộc tính [Authorize] và mã ActionFilter liên quan MVC gọi nội bộ Page.User.Identity.IsAuthenticated giống như các ví dụ mã đó.

+0

Đã chọn đôi và đây là Biểu mẫu Xác thực – elwyn

3

Request.IsAuthenticated sẽ hoạt động cho những gì bạn đang cố gắng làm.

+3

Nếu tôi làm điều đó trên một hành động được trang trí với '[Ủy quyền]' nó hoạt động tốt, tuy nhiên nếu tôi làm điều đó trên Hành động này (không được trang trí với [Ủy quyền]) nó luôn luôn là sai, bất kể tôi có đăng nhập hay không . – elwyn

1

Tạo một thuộc tính như thế này: OnActionExecuting sẽ được thực hiện đầu tiên trước khi các mã khác từ hành động

 public class IsAuthenticatedAttribute : ActionFilterAttribute 
     { 
      public override void OnActionExecuting(ActionExecutingContext filterContext) 
      { 
       //do your validations here. and redirect to somewhere if needed. 
       filterContext.HttpContext.Response.Redirect("/") //this will send user to home. 
      } 
     } 

trên mỗi hành động, nơi bạn cần phải kiểm tra, thêm thuộc tính như thế này:

[IsAuthenticatedAttribute] 
public ActionResult ActionName(parameters?) 
{ 
    // no need to worry about checking here. 
    //do you action things 
} 

EDIT: Điều này vẫn hoàn thành hành động và sau đó chỉ chuyển hướng nó. Không hữu ích lắm.

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