Привет,
У нас есть приложение .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: Извините, если форматированиене на должном уровне, но это мой первый вопрос