16

tôi có một dự án sử dụng ASP.Net MVC3 và sử dụng tư cách thành viên cho vai trò. tôi sử dụng ủy quyền trong mọi bộ điều khiển. ví dụ:ASP.Net MVC 3 Chuyển hướng Không được phép Người dùng không đăng nhậpUrl

[Authorize(Roles = "Administrator")] 
    public ActionResult Index(string q, int i) 
    { 
     return View(model); 
    } 

nếu ai đó doesnt có vai trò quản trị, sau đó nó sẽ chuyển hướng đến trang đăng nhập theo mặc định. làm thế nào để thay đổi nó, vì vậy nó sẽ chuyển hướng vào Views/Shared/UnAuthorize.cshtml? hoặc có thể nếu ai đó không có vai trò cho quản trị viên, nó sẽ hiển thị hộp thông báo (cảnh báo)?

cảm ơn trước.

Trả lời

11

Chỉ cần thay đổi các trang đó phải được thể hiện trong web.config (kiểm tra các tuyến đường hiện hữu)

<authentication mode="Forms"> 
    <forms loginUrl="~/UnAuthorize" timeout="2880" /> 
</authentication> 

Nếu bạn, thay vào đó, muốn chuyển hướng đến một đường dẫn cụ thể cho mọi vai trò, bạn có thể mở rộng AuthorizeAttribute với chính mình. Một cái gì đó như thế này (không được thử nghiệm, tôi viết điều này để cung cấp cho bạn một ý tưởng)

public class CheckAuthorize : ActionFilterAttribute 
{ 
    public Roles[] Roles { get; set; } 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    //Your code to get the user 
    var user = ((ControllerBase)filterContext.Controller).GetUser(); 

    if (user != null) 
    { 
     foreach (Role role in Roles) 
     { 
     if (role == user.Role) 
      return; 
     } 
    }  
    RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary(); 
    if user.Role==Role.Administrator 
    { 
     redirectTargetDictionary.Add("action", "Unauthorized"); 
     redirectTargetDictionary.Add("controller", "Home"); 
    } 
    else 
    { 
     redirectTargetDictionary.Add("action", "Logon"); 
     redirectTargetDictionary.Add("controller", "Home"); 
    } 
    filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary); 
    } 
} 
+1

cảm ơn, bạn đã giúp tôi một lần nữa :) –

+2

Giải pháp này sẽ dẫn đến chuyển hướng đến trang Không được phép đối với cả yêu cầu chưa được xác thực và không được xác thực –

+0

Đó là sự thật. Tôi đã thực hiện câu trả lời của tôi để phản ánh quan điểm của bạn. – Iridio

3

Vâng, bạn có thể kế thừa từ AuthorizeAttribute và ghi đè HandleUnauthorizedRequest chịu trách nhiệm chuyển hướng các yêu cầu chưa được xác thực/không được xác thực. tôi nghĩ rằng this question sẽ rất hữu ích đối với bạn

+0

cảm ơn, bạn có thể cho tôi exampel mã? –

+0

câu hỏi tôi gọi là chứa mã ví dụ. nếu có vấn đề plz cho tôi biết –

23

tôi đã giải quyết được vấn đề của mình. tôi chỉ làm điều này:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

public class MyAuthorize : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
    //you can change to any controller or html page. 
    filterContext.Result = new RedirectResult("/cpanel/roles/unauthorize"); 

    } 
} 

và áp dụng MyAuthorize đến lớp hoặc hành động:

[MyAuthorize] 
public class AdminController :Controller 
{ 
} 

thats it.

0

Tôi sử dụng phương pháp này và rất dễ thực hiện.

Securing Asp.net MVC3

Thay đổi tuyến đường mặc định của bạn để đăng nhập trang trong global.asax

1

phiên bản riêng của tôi, dựa trên NTEP vodka của:

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if(IsUserAuthenticated(filterContext.HttpContext)) 
     { 
      filterContext.Result = new RedirectResult("/Account/InvalidRole"); 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 

    private bool IsUserAuthenticated(HttpContextBase context) 
    { 
     return context.User != null && context.User.Identity != null && context.User.Identity.IsAuthenticated; 
    } 
} 

Bằng cách này tôi có được chuyển hướng chuẩn để trang đăng nhập cho không được xác thực người dùng và chuyển hướng tùy chỉnh cho người dùng được xác thực nhưng không có vai trò phù hợp cho hành động.

1

Đoạn code dưới đây giúp và đây là tài liệu tham khảo trong stackoverflow ASP.NET MVC 4 custom Authorize attribute - How to redirect unauthorized users to error page?

public class CustomAuthorize: AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if(!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
     else 
     { 
      filterContext.Result = new RedirectToRouteResult(new 
      RouteValueDictionary(new{ controller = "Error", action = "AccessDenied" })); 
     } 
    } 
} 
Các vấn đề liên quan