Я борюсь со строительством пользовательского поставщика членства, который позволяет мне иметь схему безопасности, в которой я нуждаюсь.Как изменить парадигму безопасности для MembershipProvider?
У меня есть собственный IPrincipal, IIdentity и MembershipProvider. У меня аутентификация работает нормально. Проблема, с которой я столкнулся сейчас, - это авторизация.
Проблема, которую я имею с помощью схемы авторизации, наследуется в поведении IsInRole от IPrincipal. Такое поведение тесно связано с различными функциями ASP.NET Webforms, и моя главная задача заключается в авторизации сайта, потому что я бы хотел использовать его, если смогу.
Таким образом, вы, возможно, традиционно есть карта сайта, как так:
<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 должны Просмотр права на Человек бизнес-объекта ,
У меня уже есть объект Авторизатор, который имеет подпись, как так:
public static bool Authorize(Type type, Access access, IUser user)
который будет принимать, например, тип личности, вид доступа (перечисление), и пользователю проверить его против. Теперь у меня есть код внутри авторизации.
Моя проблема в том, как я могу получить IsInRole от IPrincipal до моего авторизованного? Я пробовал разные вещи, но никто из них, похоже, не работает. Мне действительно не нравится подход магической струны, но кажется, что я застрял в этом. Если бы был способ построить его строго типизированным образом, я бы определенно предпочел это вместо этого. Есть ли лучший способ сделать это, о котором я не думаю?
Спасибо за ваше предложение. Джош, мне нравится идея иметь PermissionFactory, чтобы изолировать генерацию магической строки. Однако генерация маркера не была бы действительно полезной в файле Sitemap. Как вы относитесь к файлам Sitemap в этом сценарии? Держите их магическими струнами? – Joseph
Если вы динамически создаете карту своего сайта, вы можете скрыть строки, но в конце дня все еще будет строка. Мне никогда не нравилось, как работают роли. Роли настолько широки, вам всегда нужна роль и возможность ... желаю, чтобы это было запечено в модели, но хорошо. – JoshBerke
@ Josh Да, мне нужно бороться с ним целиком, потому что моя парадигма принципиально отличается. Это очень раздражает. – Joseph