Я пытаюсь создать приложение в ASP.NET Core MVC и использовать авторизацию на основе ролей с проверкой подлинности Windows.
Несмотря на то, что я добавил все роли в HttpContext на своем базовом контроллере, он по-прежнему не выдает запрос/ошибку несанкционированного доступа при переходе к контроллеру с моей учетной записью, не имеющей требуемой роли.
Единственная проблема, о которой я думаю, это, возможно, я неправильно настроил авторизацию в Startup.cs?
Вот мой Startup ConfigureService:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<CimsDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MyDatabase")));
services.AddControllersWithViews();
services.AddDistributedMemoryCache();
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddAuthorization();
services.AddSingleton(Configuration);
services.AddSession(options =>
{
options.Cookie.Name = ".MySession";
options.IdleTimeout = TimeSpan.FromMinutes(Convert.ToDouble(Configuration.GetSection("inMinutes").Value));
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
}
Вот моя конфигурация запуска:
public void Configure(IApplicationBuilder app)
{
if (_env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
Затем мой базовый класс контроллера:
[AllowAnonymous]
public class AppSessionController : Controller
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (HttpContext.User.Identity.IsAuthenticated)
{
//no valid session / create new session
if (String.IsNullOrEmpty(HttpContext.Session.GetString(AppSessionIdentifier.IsAlive)))
{
//initialize new user identity
HttpContext.User = UserIdentity.NewUserIdentity(config, HttpContext);
}
}
base.OnActionExecuting(filterContext);
}
}
А дальше моя функция NewUserIdentity:
public static GenericPrincipal NewUserIdentity(IConfiguration config, HttpContext httpContext)
{
string AccountName = httpContext.User.Identity.Name.Split('\\')[1];
string Env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
List<string> roles = new List<string>();
if (ADHelper.IsInGroup(AccountName, config.GetSection($"ADGroupRoles:{Env}:ReadOnly").Value))
roles.Add(Roles.ReadOnly.ToString());
if(ADHelper.IsInGroup(AccountName, config.GetSection($"ADGroupRoles:{Env}:Admin").Value))
roles.Add(Roles.Admin.ToString());
return new GenericPrincipal(new GenericIdentity(AccountName), roles.ToArray());
}
Мой контроллер с атрибутом авторизации:
[Authorize(Roles = "ReadOnly")]
public class MatterController : AppSessionController
{
[Authorize(Roles = "ReadOnly")]
public ActionResult Details(int matterId)
{
return View();
}
}
Мои роли перечислены:
public enum Roles
{
[Description("ReadOnly")]
ReadOnly = 1,
[Description("Administrator")]
Admin = 4
}