.Net Core авторизует аутентифицированных пользователей с помощью Azure AD - PullRequest
0 голосов
/ 24 сентября 2018

Привет,

У нас есть приложение .Net Core 2.0 с аутентификацией Azure AD.В настоящее время у нас есть несколько пользователей, связанных с приложением, которым была назначена роль для приложения в Azure AD, и мы используем политики для проверки авторизации.Из-за требований бизнеса мы хотим открыть приложение для любого пользователя в компании, поэтому нам нужно только проверить, что пользователь аутентифицирован.

Как опытный разработчик C #, я обратился к контроллеру со следующим кодом


[Authorize(Policy = PolicyNames.RequireLinecardsUser)]
        public class LinecardController : Controller
        {
            //controller code here
        }
и изменил его на этот

    [Authorize]
        public class LinecardController : Controller
        {
            //controller code here
        }
, и для майского пользователя, который все еще играет роль LinecardUser, он работает.он может получить доступ к приложению (главная точка входа находится внутри этого контроллера).Но когда мы протестировали его с пользователем, у которого нет роли в приложении, он получает исключение, запрещающее доступ.

Итак, следующим шагом мы пошли в автозагрузку и удалили настройки авторизации (в ней было только 2 неиспользуемых политики).


    public void ConfigureServices(IServiceCollection services)
            {
                try
                {
                    services.AddDbContext(options =>
                    {
                        options.UseSqlServer(Configuration.GetConnectionString("LinecardsContext"), opt => opt.UseRowNumberForPaging());
                    });
                    services.AddAuthentication(options =>
                        {
                            options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                            options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                            options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
                            options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                            options.DefaultForbidScheme = OpenIdConnectDefaults.AuthenticationScheme;
                        })
                        .AddCookie(options =>
                        {
                            options.AccessDeniedPath = "/Account/AccessDenied/";
                            options.LoginPath = "/Account/Login/";
                        })
                        .AddOpenIdConnect(options =>
                        {
                            configuration.GetSection("AzureAd").Bind(options);
                        });

                   services.AddAuthorization(options =>
                        {
                            options.AddPolicy(PolicyNames.RequireLinecardsUser,
                                      policy =>
                                      {
                                              policy.AddRequirements(new LinecardsWebUserRequirement()); 
                                              policy.RequireAuthenticatedUser(); // Adds DenyAnonymousAuthorizationRequirement 
                                                                                 // By adding the CookieAuthenticationDefaults.AuthenticationScheme, if an authenticated
                                                                                 // user is not in the appropriate role, they will be redirected to a "forbidden" page.
                                              policy.AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme);
                                      });

                            options.AddPolicy(PolicyNames.RequireLinecardsAdmin,
                                        policy =>
                                        {
                                            policy.AddRequirements(new LinecardsWebAdminRequirement());
                                            policy.RequireAuthenticatedUser(); // Adds DenyAnonymousAuthorizationRequirement 
                                                                               // By adding the CookieAuthenticationDefaults.AuthenticationScheme, if an authenticated
                                                                               // user is not in the appropriate role, they will be redirected to a "forbidden" page.
                                                policy.AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme);
                                        });
                        });

                    services.AddScoped();

                    services.RegisterTypes();

                    services.AddReact();

                    services.AddAutoMapper();

                    services.Configure(x => x.ValueCountLimit = 100000);
                    services.AddMvc();
                }
                catch (Exception ex)
                {
                    Log.Error(ex, "Error happened on configuring services");
                    throw;
                }
            }
Это означает, что в предыдущем коде мы удалили сервисы. AddAuthentication ();блок.Тот же результат, пользователи, имеющие роли, могут получить доступ к приложению, пользователи, которые не могут.(пробовал с браузером в анонимном режиме, чтобы убедиться, что здесь не было проблем с кэшированием).

Наконец, мы попытались изменить политику RequireLinecardsUser, чтобы у нее не было политики. AddRequirements (new LinecardsWebUserRequirement ());line (и изменил контроллер на исходную строку авторизации с политикой. Еще раз, те же результаты, отлично работают для меня, доступ запрещен для пользователей, у которых нет роли.

Я что-то упускаю из виду?Что-то изменилось в Core 2.0? Что-то связанное с Azure? Потому что каждая найденная мной документация говорит о том, что аннотация [Authorize] без каких-либо аргументов должна работать и предназначаться, и проверять только то, что пользователь аутентифицирован, прежде чем позволить коду продолжить ...

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

PPS: Извините, если форматированиене на должном уровне, но это мой первый вопрос

1 Ответ

0 голосов
/ 26 сентября 2018

После еще нескольких тестов с этим приложением исключение указывает на то, что Azure является виновником этого.В свойствах приложения в Azure есть опция с вопросом «Требуется ли назначение пользователя?».Этот конкретный параметр был установлен на да для этого приложения.Изменение не решило проблему.

...