Выберите конечную точку на основе роли пользователя

#c# #asp.net #.net #asp.net-core

Вопрос:

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

Правка: У меня есть типичный пользовательский контроллер с ролевой авторизацией. Я хотел бы иметь два метода в контроллере, например. SearchForAdmin и SearchForUser (оба с URL ../пользователи/поиск). Метод должен быть выбран на основе Роли из токена B2C. Есть какие-нибудь идеи о том, как я мог бы этого достичь?

Комментарии:

1. Можете ли вы поделиться небольшим количеством кода, даже если он не работает, о том, чего вы пытаетесь достичь? Ваш вопрос прямо сейчас довольно расплывчат, поэтому я не уверен, в каком направлении искать решение.

2. @BenMatthews Я обновил вопрос, возможно, теперь он более описательный. Я не начал его внедрять, потому что сначала ищу возможные решения.

Ответ №1:

Функция требуемой авторизации для конечных точек может быть тем, что вы ищете. Я не пробовал это с двумя разными конечными точками с одним и тем же путем, и единственная разница заключается в двух разных политиках, но я знаю, что два пути с разными хостами require будут работать. Например, я знаю, что это работает для меня:

 app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();

                endpoints.MapGet("/Foo", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                }).RequireHost("Something.com");


                endpoints.MapGet("/Foo", async context =>
                {
                    await context.Response.WriteAsync("Hello World From Local!");
                }).RequireHost("localhost");
            });
 

Я думаю, что если вы попробуете это, это должно сработать, если оно останется последовательным:

 app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();

                endpoints.MapGet("/Foo", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                }).RequireAuthorization("FirstAuthPolicy", "SecondAuthPolicy");


                endpoints.MapGet("/Foo", async context =>
                {
                    await context.Response.WriteAsync("Hello World from a second place!");
                }).RequireAuthorization("ThirdAuthPolicy");
            });