Я работаю над небольшим приложением, которое использует Blazor и Аутентификацию / Авторизацию, и по большей части авторизация на основе ролей идеальна. Однако у меня есть пара сценариев ios, где мне нужно авторизовать несколько ролей в компоненте AuthorizeView, и я не уверен, что делаю это наилучшим образом. Я пытаюсь избежать жесткого кодирования строковых значений в компоненты, поэтому я начал с установки класса stati c для управления строковыми значениями следующим образом:
public static class Roles
{
public const string Admin = "Admin";
public const string CanManageClients = "CanManageClients";
public const string CanManageProjects = "CanManageProjects";
}
Теперь я могу использовать эти значения везде, где они мне нужны, и для стандартной авторизации на основе атрибутов я расширил класс AuthorizeAttribute, чтобы позволить мне передавать несколько значений по мере необходимости. Теперь у меня есть атрибут [AuthorizeRoles]
для использования. Пока проблем нет. Я могу украсить всю страницу примерно так:
@attribute [AuthorizeRoles(Roles.Admin, Roles.CanManageClients)]
и декорирование соответствующего метода по мере необходимости:
[AuthorizeRoles(Roles.Admin, Roles.CanManageClients)]
public void DoTheThing()
{
//Doing things
}
Однако, когда дело доходит до компонента Blazor AuthorizeView, все становится сложно. , Синтаксис Razor не позволяет мне связывать несколько ролей вместе или интерполировать строку, поэтому я нашел обходной путь, который выполняет работу:
<AuthorizeView Roles="@rolesList">
<Authorized>
//View related code once authorized
</Authorized>
</AuthorizeView>
И связанный блок кода, который создает строку, разделенную запятыми, которая Компонент ожидает:
@code {
string rolesList => $"{Roles.Admin}, {Roles.CanManageClients}";
}
Это работает так, как должно, и возвращает меня туда, где я должен быть, но выглядит и кажется мне хакерским. Я избегал сценария со страшной магией c, но в другой части кода, поддерживающего компонент, у меня есть странно выглядящее вспомогательное поле. Я знаю, что мог бы решить эту проблему, перейдя на систему, основанную на политиках или утверждениях, но это, честно говоря, было бы излишним для этого небольшого приложения, поскольку у меня есть только несколько вариантов использования. Любая обратная связь от сообщества будет принята с благодарностью, может быть, я не думаю о чем-то, и, может быть, это просто так, как есть?