настраиваемый атрибут для фильтрации по группам аутентификации для доступа к API - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть список групп проверки подлинности Windows, например

  • developer_group
  • hr_group
  • qa_group
  • db_group

Я хочу создать пользовательский атрибут для фильтрации групп пользователей, которым разрешено выполнять API, примерно так.Я не уверен, что это можно сделать так.

 [MYcustomattribute(groups = hr_group,qa_group)]
 public ActionResult About()
 {
    ViewBag.Message = "Your application description page.";

    return View();
 }

Сначала мне нужно получить пользователя и все его группы.Как проверить, принадлежит ли пользователь к этой группе, и разрешить ли ему доступ к API?

Контроллер:

namespace AuthenticationSample.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }
        [MYcustomattribute(groups = hr_group,qa_group)]
        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }
}

Класс фильтра:

public class MYcustomattribute : ActionFilterAttribute

{

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        //You may fetch data from database here 
        filterContext.Controller.ViewBag.GreetMesssage = "Execute my filter";
        base.OnResultExecuting(filterContext);
    }


    public static bool IsMemberOfGroup(string userName, string groupName)
    {
        if (string.IsNullOrEmpty(userName))
            return false;

        using (var context = new PrincipalContext(ContextType.Domain))
        {
            using (var user = UserPrincipal.FindByIdentity(context, userName))
            {
                if (user != null)
                {
                    var groups = user.GetGroups();
                    foreach (var group in groups)
                    {
                        if (group.Name.Trim().ToUpper() == groupName.Trim().ToUpper())
                            return true;
                    }
                }
            }
        }

        return false;
    }
}

1 Ответ

0 голосов
/ 19 декабря 2018

Вы можете изменить приведенный ниже код, чтобы реализовать структуру, описанную в вашем вопросе.

public class MyCustomAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            if (context.HttpContext.Session != null)
            {
                var request = context.HttpContext.Session["User"] as User;
                if (request != null)
                {
                    if (request.UserGroups.Contains("some_group"))
                    {
                        //do something
                    }

                    if (request.UserGroups.Contains(""))
                    {
                        // do something else
                    }

                }
                else
                {
                    //No group info, kinda BadRequest!
                    filterContext.Result = new RedirectResult("/index.html");
                }
            }
        }

Идея состоит в том, что вы можете отклонять любые запросы от нежелательной группы людей, перенаправляя их на какую-либо страницу.или возвращение неверного запроса типа сообщения.Кроме того, вы можете попытаться изменить класс пользователя, как показано ниже, чтобы легко получить информацию о группе (просто предложение).Надеюсь, это вам поможет.

public class User
{
    //....
    //....
    //User Attributes
    public List<string> UserGroups { get; set; }
}

Наконец, вы можете применить этот атрибут следующим образом.

    [MyCustom]
    public IActionResult YourControllerMethod()
    {
        return View();
    }

Редактировать: Чтобы получить объект из HttpClient, вы можете проверить это в случае получения нулевого сеанса HttpContext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...