не удалось найти атрибут авторизации для пользователей в ядре asp.net - PullRequest
0 голосов
/ 08 февраля 2019

Я просто хочу авторизовать пользователей для моих действий, таких как

[Authorize(Users = "anupam,ashwin")]  
public ActionResult AddArticle()  
{  
   return View();  
}  

Ссылка здесь

Но я нашел Roles в AuthorizeAttribute, как показанониже

enter image description here

Я хочу использовать атрибут Users для Авторизации, есть ли альтернативный способ в ядре asp.net ??

1 Ответ

0 голосов
/ 08 февраля 2019

Статья, на которую вы ссылаетесь, предназначена для ASP.NET MVC, а не для ASP.NET Core.В общем, вы должны что-то игнорировать, поскольку это больше не применимо.

Казалось бы, ASP.NET Core удалил поддержку для указания Users в AuthorizeAttribute (хотя, честно говоря, я не знал, что ASP.NET MVC было это в первую очередь).Можно подражать этой функции с помощью политик, хотя:

services.AddPolicy("MustBeJoeOrBob", p =>
    p.RequireAssertion(c =>
        new[] { "Joe", "Bob" }.Contains(c.User.Identity.Name)));

Затем:

[Authorize(Policy = "MustBeJoeOrBob")]

Однако, если это неясно, для этого требуется немало жесткого кодирования ивам нужна отдельная политика для каждой отдельной группы пользователей.Например, если к другому действию могут обращаться только Джо и Мэри, но , а не Боб, то вам также необходимо добавить политику "MustBeJoeOrMary".Это может быстро стать утомительным.

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

public class UsersAuthorizeAttribute : AuthorizeAttribute
{
    private const string PolicyPrefix = "MustBeUsers"

    public UsersAuthorizeAttribute(string users)
    {
        Users = users;
    }

    public string Users
    {
        get => Policy.Substring(PolicyPrefix.Length);
        set => $"{PolicyPrefix}{value}";
    }
}

Затем вы можете применить атрибут как:

[UsersAuthorize("Joe,Bob")]

Это фактически делает то же самое, что и:

[Authorize(Policy = "MustBeUsersJoe,Bob")]

В другихсловами, это всего лишь краткий способ создания «динамического» имени политики.Однако теперь вам нужен обработчик политики, поэтому вы либо возвращаетесь к тому же пути создания его для каждой возможной комбинации пользователей, либо вам нужно создать собственного поставщика политик.Затем этот провайдер политики может посмотреть только на префикс «MustBeUsers» и использовать что-то вроде MustBeUsersAuthorizationHandler для удовлетворения политики, передавая оставшееся имя политики (то есть фактические имена пользователей) в обработчик, чтобы он сделал этооценка по.Тем не менее, ASP.NET Core будет использовать только одного поставщика политик, поэтому после того, как вы перейдете на другой, вы также должны убедиться, что он поддерживает другие политики, или, по крайней мере, делегировать обработку политик внутреннему поставщику по умолчанию. Документы детализируются , но достаточно сказать, что вы можете начать быстро лезть в сорняки.

Честно говоря, весь этот подход выглядит как огромный взлом, и я на самом делеочень удивлен, что документы фактически описывают, как этого добиться в деталях.Если вам действительно нужно что-то подобное, это может иметь смысл, но в вашем сценарии, я думаю, вы упускаете важную вещь: вы можете просто использовать роли.

Если вы хотите толькоДжо и Боб, чтобы иметь возможность получить доступ к определенному действию, затем просто создать роль и назначить их на это.Затем укажите эту роль:

[Authorize(Roles = "JoeAndBobsRole")]

Это то, для чего предназначены роли, и вы, по сути, пытаетесь обойти это и реализовать ту же функциональность другим способом.Это, честно говоря, вероятно, почему Users не существует в качестве опции в ASP.NET Core в первую очередь.

...