Безопасность на основе ролей без проверки подлинности с помощью форм в ASP .NET
Я хотел бы воспользоваться:
Page.User.IsInRole("CustomRole");
Page.User.Identity.IsAuthenticated
при работе внутри методов Page, а также в разделе авторизации в web.config:
<authorization>
<allow roles="Administrators, Supervisors" />
<deny users="*" />
</authorization>
а также применять правила на уровне классов и методов:
[PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]
В моем приложении я аутентифицируюсь с помощью... специального механизма, который предоставляет мне идентификатор пользователя в... http заголовке. Я получаю ПИН-код пользователя (какой-то идентификатор) + роли. Но это побочный сюжет. Это не важно
Чего я на самом деле хочу достичь, так это воспользоваться встроенными функциями авторизации ASP .NET, но с моим собственным механизмом аутентификации. Я думаю, что я должен реализовать IPrincipal и IIdentity, это правильно? Я видел множество примеров в Интернете, но все они включают конфигурацию web.config, которая определяет провайдеров, а также FormsAuthentication как классы, которые, я думаю, мне не нужны. Мне просто нужно вставить свой пользовательский объект (который я подготовил) в запрос, и все.
Так:
- какой самый простой способ добиться этого?
- В чем разница между GenericPrincipal / IPrincipal?
как получить / создать объект IIdentity? Я видел образцы с:
var id = new FormsIdentity (authTicket);
но я не использую FormsAuthentication.
Спасибо
2 ответа
Короче говоря, вы должны реализовать свой собственный модуль аутентификации.
Модуль аутентификации - это просто модуль ASP.NET, но имеющий специальное назначение. это AuthenticateRequest
метод должен заполняться HttpContext.Current.User
свойство с экземпляром IPrincipal
,
Отвечая на другие ваши вопросы: IPrincipal
это просто интерфейс в то время как GenericPrincipal
является одной из его реализаций. Вы можете использовать его, как следует из названия, это просто общая реализация, которая означает, что она должна вам подойти. поскольку IPrincipal
просто IIdentity
плюс роли, вам, вероятно, тоже понадобится GenericIdentity
,
Другие реализации, такие как RolePrincipal
+ FormsIdentity
предназначены для конкретных целей, эти два, например, используются модулем проверки подлинности форм.
Есть несколько хороших примеров, просто Google для "пользовательский модуль аутентификации".
Прежде чем делать это (создавать / реализовывать свою собственную), пробовали ли вы рассмотреть вопрос об адаптации проверки подлинности с помощью форм к существующей схеме проверки подлинности?
Я думаю, что вы "почти у цели" (используя все встроенные в ASP.net средства авторизации / членства / профили / роли), и может быть проще / проще просто "подключить" существующую схему аутентификации к проверке подлинности с помощью форм.
Этот фрагмент кода должен дать вам представление о том, насколько гибкой может быть аутентификация с помощью форм:
if ((UserEmail.Text == "jchen@contoso.com") && (UserPass.Text == "37Yj*99Ps"))
{
FormsAuthentication.RedirectFromLoginPage
(UserEmail.Text, Persist.Checked);
}
else
{ ... }
Таким образом, он работает с жестко закодированной "схемой аутентификации" (не так, как вы должны, но дает представление о возможностях) или даже со списком в web.config - опять же, просто пример:
<authentication mode="Forms">
<forms name=".FUBAR">
<credentials passwordFormat="MD5">
<user name="foo" password="b7ab5072e8fba7bed20384cc42e96193"/>
<user name="bar" password="1c42e49a360aa7cc337a268a1446a062"/>
<user name="john" password="5f4dcc3b5aa765d61d8327deb882cf99"/>
<user name="jane" password="7c6a180b36896a0a8c02787eeafb0e4c"/>
</credentials>
</forms>
</authentication>
Просто мысль - хт....