Set 2 authorize cho Admin và phía Client

  • 1,3K lượt xem
  • Bài cuối 16 Tháng Tám 2016
  • Chủ đề được giải quyết
Long Nguyen đăng này 12 Tháng Tám 2016

Mình trạo 1 Areas có tên là Admin
Mình muốn bắt buộc đăng nhập nếu ai vào admin thì mình set Authorize cho Controller trong Admin.
Và setting trong file config ở thư mục Root là:

<system.web>

    <authentication mode="Forms">

      <forms name="Admin-Login" loginUrl="~/Admin/Account/Login" timeout="20" />

    </authentication>
 </system.web>


Nhưng nếu như vậy thì những Action nào ở Client có đặt Authorize cũng sẽ bị redirect về trang Login của Admin

Mọi mọi người giúp mình (bow)

Sắp xếp theo: Chuẩn | Mới nhất | Bình chọn
admin đăng này 12 Tháng Tám 2016

Theo mình bạn có thể custom cái authorize:

http://stackoverflow.com/questions/20424704/mvc4-areas-and-forms-authentication

TEDU

Long Nguyen đăng này 12 Tháng Tám 2016

Mình có làm như hướng dẫn đầu tiên.
Nhưng nó vẫn không được.
Mình nghĩ nguyên nhân có phải do file Startup.Auth.cs hay không?
Vì trong đó có setting 

LoginPath = new PathString("/Admin/Account/Login")           

Nếu mình đổi thành /Admin/Account/Login thì nó chuyển vào Admin/Account/Login, còn nếu chuyển thành /Account/Login thì nó vào trang login của Client

Cảm ơn rất nhiều nhiều nhiều

admin đăng này 13 Tháng Tám 2016

Bạn học khóa AngularJS đúng ko, vậy thì Authen của Admin phải là token base cho angularjs, chứ không phải là cùng cơ chế với phần bên client được,

TEDU

  • Thích bởi
  • Long Nguyen
Long Nguyen đăng này 13 Tháng Tám 2016

Không bạn. Hiện tại mình đang làm đồ án kì 3 ASP.NET MVC.
Mình dùng Identity cho phần Login của cả Client lẫn Admin.
Mình không biết mình có làm sai chổ nào không (so với thực tế)

 

admin đăng này 13 Tháng Tám 2016

Bạn làm theo cách customize cái authorize như link mình gửi là ok. Với area thì redirect đến trang login của area, với trang ngoài thì redirect đến trang ngoài. Còn chú mới làm đồ án kỳ 3 thì chắc là ít tuổi hơn a, a sn 89

TEDU

  • Thích bởi
  • Long Nguyen
Long Nguyen đăng này 13 Tháng Tám 2016

Dạ vâng. Cảm ơn anh Em 94. Em đang làm đồ án của Aptech

Em có làm thử qua nhưng không rõ có phải do thằng bên dưới này hay không, mà nếu cứ để như vậy thì không thể nào về login của Admin được.
LoginPath = new PathString("/Account/Login")
https://gyazo.com/424c502b421190d0ce989cc7552e54e4


Code của custom Authorize Attribute:

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

namespace ProjectSem3.Common
{
    public class AreaAuthorizeAttribute : AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            string area = filterContext.RouteData.Values.ContainsKey("area")
                            ? filterContext.RouteData.Values["area"].ToString()
                            : null;
            if (area == "Admin")
            {
                RouteValueDictionary routeValues = new RouteValueDictionary
                {
                    {"controller" , "Account"},
                    {"action" , "Login"},
                    {"area" , "Admin"}
                };
                filterContext.Result = new RedirectToRouteResult("AdminAreaRoute", routeValues);
            }
            else if (area == "User")
            {
                RouteValueDictionary routeValues = new RouteValueDictionary
                {
                    {"controller" , "Login"},
                    {"action" , "Index"},
                    {"area" , "User"}
                };
                filterContext.Result = new RedirectToRouteResult("UserAreaRoute", routeValues);
            }
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}


Em cũng có thử hỏi Stackoverflow nhưng chưa thấy ai trả lời  
Cảm ơn anh đã giúp đỡ nhịệt tình

admin đăng này 13 Tháng Tám 2016

Em thử debug vào cái này xem, em đã gọi attribute này ở các controller chưa. và debug xem nó chạy vòa đây ko.

 

TEDU

  • Thích bởi
  • Long Nguyen
Long Nguyen đăng này 13 Tháng Tám 2016

if (area == "Admin")
{
   RouteValueDictionary routeValues = new RouteValueDictionary
   {
      {"controller" , "Account"},
      {"action" , "Login"},
      {"area" , "Admin"}
   };
   filterContext.Result = new RedirectToRouteResult("AdminAreaRoute", routeValues);
}

Cho em hỏi là cái "AdminAreaRoute" mình tạo ở trong file "RouteConfig.cs" ở trong thư mục App_Start đúng không ạ.

public class RouteConfig
{
   public static void RegisterRoutes(RouteCollection routes)
   {
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
      routes.MapRoute(
         name: "AdminAreaRoute",
         url: "{area}/{controller}/{action}/{id}",
         defaults: new { area = "Admin", controller = "Home", action = "Index", id = UrlParameter.Optional },
         namespaces: new[] { "ProjectSem3.Areas.Admin.Controllers" }
     &nbsp;
      routes.MapRoute(
         name: "Default",
         url: "{controller}/{action}/{id}",
         defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
         namespaces: new[] { "ProjectSem3.Controllers" }
     &nbsp;
   }
}

 

admin đăng này 13 Tháng Tám 2016

a nhớ là trong area cũng có 1 cái route config

TEDU

  • Thích bởi
  • Long Nguyen
Long Nguyen đăng này 13 Tháng Tám 2016

Dạ. Là thằng này đây anh:
- https://gyazo.com/556dc3aef15cc99af7b98d613e248a49
- https://gyazo.com/4602eb5dc25dcbc3b35e1bd15a6560fb

Lúc em tạo 1 cái route bên trong RouteConfig của Admin thì chỉ cần nhập local host nó cũng tự nhảy vào trang Login của Admin, không thể di chuyển sang trang khác được, dù em không đặt Authorize trang Home ở Client:
Application_Start: https://gyazo.com/d46f3618c29d8261c1a79a71ea108703

admin đăng này 14 Tháng Tám 2016

Ồ thế thì chưa ổn lắm nhỉ, để chú pm fb của anh sau a vào xem thử nhé. FB ở profile của a ấy nhé

TEDU

Long Nguyen đăng này 14 Tháng Tám 2016

Sau khi debug em phát hiện ra code sau không get về được key area:

string area = filterContext.RouteData.Values.ContainsKey("area")
                ? filterContext.RouteData.Values["area"].ToString()
               : null;

Vậy nên em đã đổi Route config trong AdminAreaRegister từ "Admin/{controller}/{action}/{id}", thành "{area}/{controller}/{action}/{id}"

Kết quả là nó lấy về được key area đúng. Nhưng khi vào những trang khác không có area thì ví dụ như localhost:8080/Home/Index thì nó bị lỗi 404
Nên em chuyển config lại như cũ. Thay đổi ở phía Custom Authorize Attribute như sau:


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

namespace ProjectSem3.Common
{
    public class AreaAuthorizeAttribute : AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            string area = filterContext.RouteData.DataTokens["area"].ToString();
            string loginUrl = "";
            if (area == "Admin")
            {
                loginUrl = "~/Admin/Account/Login";
                filterContext.Result = new RedirectResult(loginUrl + "?returnUrl=" + filterContext.HttpContext.Request.Url.PathAndQuery);
            }
        }
    }
}

Thì nó chạy ngon lành. Cảm ơn anh đã giúp đỡ rất nhiều  
PS: Trang web này hình như nó có đặt time out login thì phải. Em thấy nó hơi bất tiện. Cỡ 10' vào lại là phải login  

admin đăng này 15 Tháng Tám 2016

ok em chắc anh để timeout hơi thấp để anh tăng nó lên

TEDU

Long Nguyen đăng này 15 Tháng Tám 2016

Dạ. Anh ơi. Reply giúp em message em gửi qua FB anh với ạ.

admin đăng này 15 Tháng Tám 2016

ấy anh quên, chú tạo chủ đề mới lên đay cho nó xôm nhé

TEDU

Long Nguyen đăng này 16 Tháng Tám 2016

Thanks bác. Để em xong cái này em thử  

Close