2013-01-13 41 views
7

Tôi có một bộ lọc yêu cầu toàn cầu để xác thực theo đề nghị của mythz (ServiceStack dev), trong này SO AnswerServiceStack toàn cầu Yêu cầu Lọc Không Firing

lọc của tôi:

RequestFilters.Add((httpReq, httpResp, requestDto) => 
{ 
    if (!PublicRoutes.Contains(httpReq.PathInfo)) 
    { 
     new AuthenticateAttribute().Execute(httpReq, httpResp, requestDto); 
    } 
}); 

Bộ lọc không cháy đối với tôi khi tôi yêu cầu các trang ServiceStack Razor kế thừa dynamic ViewPage

Ví dụ /Default.cshtml:

@inherits ViewPage 
<!DOCTYPE html> 
<html> 
    <head> 
     <title>HOME</title> 
... 
... 
ETC 

Xuống dưới cùng của answer, trong nhận xét, trình tạo câu hỏi đề xuất hành vi tương tự, nhưng không mô tả chính xác cách sao chép, vì vậy tôi không thể thấy giải pháp.

Có giải pháp nào không? Tôi đã làm điều gì đó không chính xác?


CẬP NHẬT

tôi đã phát hiện ra tôi có thể tuyên bố các thuộc tính trên trang của mình trực tiếp:

@using ServiceStack.ServiceInterface 
@inherits ViewPage 

@{ 
    new AuthenticateAttribute().Execute(Request, Response, this); 
} 
<!DOCTYPE html> 
... 
... 
ETC 

Hoặc tôi chắc chắn rằng tôi có thể tạo ra một lớp kế thừa ViewPage và chạy chúng trong phương thức Init của nó và sử dụng lớp mới trên các trang Razor.

Cả hai giải pháp đó dường như không liên quan và không phải là rất DRY.

Trả lời

1

tôi đã kết thúc tạo của riêng tôi ViewPage lớp để đạt được điều này và cách gọi các bộ lọc sau khi mô hình đã được thiết lập trên trang:

public abstract class FilterViewPage<TModel> : ViewPage<TModel> 
    where TModel : class 
{ 
    public override void SetModel(object o) 
    { 
     base.SetModel(o); 

     this.AppHost.RequestFilters.ForEach(action => action.Invoke(this.Request, this.Response, this.Model)); 
     this.AppHost.ResponseFilters.ForEach(action => action.Invoke(this.Request, this.Response, this.Model)); 
    } 
} 

tôi đảm bảo chỉ trang cấp cao nhất kế thừa này, chứ không phải áp dụng nó để partials để các bộ lọc chỉ kích hoạt một lần.

0

Vâng, ngoài việc kiểm tra xem ai đó có đăng nhập hay không, phần lớn các công việc dựa trên vai trò được xử lý cho bạn dựa trên các thuộc tính trên yêu cầu DTO. Đối với những gì bạn đang làm có một vài lựa chọn. Đầu tiên là phải có một dto trống mà không làm bất cứ điều gì:

[Route("/")] 
[Authenticate] 
public class Default { } 

public class DefaultService : Service 
{ 
    public object Get(Default req) 
    { 
     return new object(); 
    } 
} 

Thứ hai là một tấm séc đơn giản nếu người dùng được đăng nhập vào trang dao cạo

@{ 
    var session = Cache.SessionAs<AuthUserSession>(); 
    if (!session.IsAuthenticated) throw new HttpException(403, "You are not logged in."); 
} 
Các vấn đề liên quan