Я использовал ASP.NET Boilerplate в качестве шаблона для моего приложения в качестве отправной точки.Я выбрал вариант многостраничного веб-приложения с настроенными страницами для входа, регистрации, пользователя, роли и арендатора.
Пытаясь реализовать свое разрешение, используя документацию по использованию IPermissionChecker
, я столкнулся с бесконечнымцикл per-say.
Если я пытаюсь получить доступ к контроллеру или действию контроллера, использующему AbpMvcAuthorize
или AbpAuthorize
, меня перенаправляют на страницу входа.
На поверхности, которая кажется разумной, returnUrl установлен на URL, к которому я только что пытался получить доступ.Таким образом, при попытке войти снова, я в конечном итоге перенаправлен на страницу входа, так как обратный URL-адрес запрещает доступ пользователю.
Поскольку .NET Core построен на Identity, я искал, где можно настроить некоторые параметры, относящиеся к пути входа в систему, пути отказа в доступе и, возможно, используемому имени файла cookie.
Примерно так:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
options =>
{
options.LoginPath = new PathString("/Account/Login/");
options.AccessDeniedPath = new PathString("/Account/Forbidden/");
});
Однако простое добавление кода такого типа в startup.cs
или событие в методе AuthConfigurer.cs Configure()
, по-видимому, не меняет этого поведения.
Если кто-нибудь может дать какое-то руководство по этому вопросу, я был бы признателен.Я думал о добавлении нового фильтра и переопределении метода HandleUnauthorizedRequest
, но простая возможность установить эти свойства где-то кажется более простым и менее сложным способом выполнения действий.
UPDATE
Чтобы прояснить ситуацию, вот как мы реализовали IPermissionChecker
довольно просто, это приложение не требует чрезвычайно детального набора разрешений с childPermissions.Он очень простой и проистекает из того, какие разрешения по умолчанию были, когда мы начинали с шаблона.
public override void SetPermissions(IPermissionDefinitionContext context)
{
context.CreatePermission(PermissionNames.Pages_Users, L("Users"));
context.CreatePermission(PermissionNames.Pages_Roles, L("Roles"));
context.CreatePermission(PermissionNames.Pages_About, L("About"));
context.CreatePermission(PermissionNames.Pages_Builders, L("Builders"));
context.CreatePermission(PermissionNames.Pages_Association, L("Association"));
context.CreatePermission(PermissionNames.Pages_DraftType, L("DraftType"));
}
Тогда у нас есть набор констант в PermissionNames.cs
public static class PermissionNames
{
public const string Pages_Users = "Pages.Users";
public const string Pages_Roles = "Pages.Roles";
public const string Pages_About = "Pages.About";
public const string Pages_Builders = "Pages.Builders";
public const string Pages_Association = "Pages.Associations";
public const string Pages_DraftType = "Pages.DraftType";
}
Когдапытаясь реализовать эти разрешения, мы используем его с аннотациями атрибутов
[HttpGet]
[AbpMvcAuthorize(PermissionNames.Pages_DraftType)]
public IActionResult Index()
Как указано выше, все это работает правильно.Просто если у меня нет прав доступа к ~/DraftType
, я перенаправляюсь на /Account/Login?ReturnUrl=%2FDraftType
.
Повторный ввод учетных данных пытается вернуть меня к '/ DraftType', но, поскольку у меня нет прав доступа к этой странице, я снова перенаправлен на URL входа, как показано выше.
Если мы вручную не удалим параметр returnUrl из адресной строки в браузере, пользователь не сможет вернуться в приложение.Вот почему я хотел бы иметь возможность различать LoginPath
и AccessDeniedPath
, чтобы при отказе в доступе пользователь перенаправлялся на страницу с ошибкой Forbidden Access
.
Если сеанс пользователя истек, но у него есть разрешение, но требуется повторная аутентификация, мне нужно, чтобы поведение оставалось прежним.Они перенаправляются на URL-адрес для входа с ReturnURL, который позволит им напрямую попасть туда, где они пытались зайти.