2010-11-18 22 views
6

Tôi đang làm việc trên một dự án sẽ sử dụng các nhà cung cấp vai trò windows và tôi muốn giới hạn chức năng cho một số nhóm quảng cáo nhất định.có một quyền sở hữu tương đương với các biểu mẫu web chuẩn (không phải MVC) cho .net

Với MVC, tôi có thể sử dụng AuthorizeAttribute phía trên các phương pháp hành động của mình và chuyển hướng tương ứng. Có cái gì tương tự tôi có thể làm cho một ứng dụng biểu mẫu web chuẩn (.NET 3.5) không sử dụng MVC?

Trả lời

4

Bạn có thể thiết lập điều này trong web.config bằng phần tử ủy quyền.

<configuration> 
    <system.web> 
    <authorization> 
     <allow roles="domainname\Managers" /> 
     <deny users="*" /> 
    </authorization> 
    </system.web> 
</configuration> 

Về cơ bản các nhóm domain được quy đổi sang vai trò khi sử dụng <authentication mode="Windows" />. Bạn có thể read more about it on MSDN

+0

đúng tôi đó. Nhưng có cách nào để hạn chế truy cập ở một mức độ phương pháp cụ thể tương tự như cách bạn có thể làm điều đó với MVC? –

+0

@Blair Jones, bạn sẽ phải thực hiện kiểm tra như 'if (User.IsInRole (" somerole "))' trong phương thức, tôi sợ. –

+0

ok cảm ơn ... đó là những gì tôi đã sợ: ( –

3

Tôi biết đây là một bài đăng cũ nhưng tôi nghĩ rằng tôi sẽ chia sẻ kinh nghiệm của mình khi tôi thực hiện điều này. Tôi không muốn sử dụng web.config. Tôi đã tìm cách tạo một thuộc tính cho các biểu mẫu web tương tự như việc triển khai MVC. Tôi đã tìm thấy một bài đăng theo số Deran Schilling mà tôi đã sử dụng làm cơ sở cho phần thuộc tính.

Tôi tạo ra một IPrincipal

interface IMyPrincipal : IPrincipal 
{ 
    string MyId { get; } 
    string OrgCode { get; } 
    string Email { get; } 
} 

và Principal

public class MyPrincipal : IMyPrincipal 
{ 
    IIdentity identity; 
    private List<string> roles; 
    private string email; 
    private string myId; 
    private string orgCode; 

    public MyPrincipal(IIdentity identity, List<string> roles, string myId, string orgCode, string email) 
    { 
     this.identity = identity; 
     this.roles = roles; 
     this.myId = myId; 
     this.orgCode = orgCode; 
     this.email = email; 
    } 

    public IIdentity Identity 
    { 
     get { return identity; } 
    } 

    public bool IsInRole(string role) 
    { 
     return roles.Contains(role); 
    } 

    public string Email 
    { 
     get { return email; } 
    } 
    public string MyId 
    { 
     get { return myId; } 
    } 
    public string OrgCode 
    { 
     get { return orgCode; } 
    } 
} 

tùy chỉnh và tạo ra một thuộc tính để sử dụng trên các trang

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
public class AdminAuthorizationAttribute : Attribute 
{ 
    public AdminAuthorizationAttribute() 
    { 
     var user = (MyPrincipal)HttpContext.Current.User; 

     if (user.IsInRole("MyAdmin")) 
      return; 

     throw new AccessDeniedException(); 
    } 
} 

và tạo ra một số trường hợp ngoại lệ tùy chỉnh

public class AccessDeniedException : BaseHttpException 
{ 
    public AccessDeniedException() : base((int)HttpStatusCode.Unauthorized, "User not authorized.") { } 
} 

public class BaseHttpException : HttpException 
{ 
    public BaseHttpException(int httpCode, string message) : base(httpCode, message) { } 
} 

và bây giờ tôi có thể áp dụng các thuộc tính để sử dụng trên một trang nhất định

[AdminAuthorization] 
public partial class Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 
} 
+2

Tôi không nghĩ rằng đây là một ví dụ rất tốt tôi sợ. Có mã trong constructor của thuộc tính, trong .NET bạn không kiểm soát được khi nào Ngoài ra chúng có thể được lưu trữ, điều này có nghĩa là HttpContext mà bạn đang dựa vào trong mã của bạn cho các thông tin người dùng có thể không phải là ngữ cảnh mà bạn nghĩ nó có thể làm việc trên một số trường hợp thử nghiệm nhưng có khả năng – AlexC

+2

@AlexC bạn có thay thế cho mã này không? (biểu mẫu web) –

+0

mã này không hoạt động trong WebForms, nó không ném bất kỳ HttpExceptions nào. –

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