Я борюсь за создание собственного провайдера членства, который позволяет мне иметь схему безопасности, которая мне нужна.
У меня есть свой собственный IPrincipal, IIdentity и MembershipProvider. У меня аутентификация работает нормально. Проблема, с которой я сейчас сталкиваюсь - это авторизация.
Проблема, с которой я столкнулся со схемой авторизации, унаследована от поведения IPrincipal IsInRole. Это поведение тесно связано с различными функциями веб-форм ASP.NET, и моей главной заботой является авторизация карты сайта, поскольку я хотел бы использовать ее, если смогу.
Таким образом, у вас может быть традиционная карта сайта, например:
<siteMap xmlns="blahblah">
<siteMapNode url="PersonView.aspx"
title="View Person"
description="View the details of a person"
roles="ViewerRole" />
</siteMap>
Здесь любой, кто пытается перейти на страницу PersonView.aspx, должен иметь ViewerRole. Это где моя проблема возникает. Я не хочу, чтобы моя авторизация была привязана к роли пользователя. Вместо этого я хочу, чтобы авторизация была привязана к поведению, которое я выполняю, и позволила некоторым скрытым вещам позаботиться об авторизации.
Так что я действительно хочу что-то вроде этого:
<siteMap xmlns="blahblah">
<siteMapNode url="PersonView.aspx"
title="View Person"
description="View the details of a person"
roles="Person|View" />
</siteMap>
Это следует интерпретировать как любой, пытающийся перейти на страницу PersonView.aspx, должен иметь Просмотр прав на бизнес-объект Person .
У меня уже есть объект Authorizer с такой подписью:
public static bool Authorize(Type type, Access access, IUser user)
Что будет принимать, например, тип Person, доступ View (enum) и пользователя для проверки. Теперь у меня есть код внутри авторизации разобрался.
Моя проблема в том, как мне перейти от IsInRole IPrincipal к моей авторизации? Я пробовал разные вещи, но ни одна из них, похоже, не работает. Мне действительно не нравится подход магической струны, но кажется, что я застрял с ним. Если бы был способ создать его строго типизированным способом, я бы определенно предпочел это. Есть ли лучший способ сделать это, о котором я не думаю?