2012-06-12 2 views
0

Я хотел бы воспользоваться:основе ролей безопасности без проверки подлинности форм в 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-заголовке. Я получаю пользовательский PIN-код (какой-то идентификатор) + роли. Но это побочный сюжет. Это не имеет значения.

На самом деле я хочу воспользоваться преимуществами создания ASP.NET в функциях авторизации, но имеет свой собственный механизм аутентификации. Думаю, мне нужно реализовать IPrincipal и IIdentity, это правильно? Я видел множество образцов в Интернете, но все они включают конфигурацию web.config, которая указывает поставщиков, а также FormsAuthentication как классы, которые, я думаю, мне не нужны. Мне просто нужно ввести свой пользовательский объект (который подготовлен мной) в запрос, и все.

Итак:

  • , что это самый простой способ добиться этого?
  • В чем разница между GenericPrincipal/IPrincipal?
  • Как получить/создать объект IIdentity? Я видел образцы с:

    var id = new FormsIdentity (authTicket);

, но я не использую FormsAuthentication.

Thanks

ответ

0

Одним словом, вы должны реализовать свой собственный модуль аутентификации.

Модуль аутентификации - это просто модуль ASP.NET, но имеющий особое назначение. Его метод AuthenticateRequest должен заполнить HttpContext.Current.User с экземпляром IPrincipal.

Отвечая на ваши другие вопросы: IPrincipal - это просто интерфейс, а GenericPrincipal - одна из его реализаций. Вы можете использовать его, поскольку название предполагает, что это всего лишь общая реализация, что означает, что он вам подойдет. Поскольку IPrincipal - это просто IIdentity плюс роли, вам, вероятно, также понадобится GenericIdentity.

Другие реализации, такие как RolePrincipal + FormsIdentity предназначены для конкретных целей, эти два, например, используются модулем аутентификации форм.

Есть несколько хороших примеров, доступных только для Google для «пользовательского модуля аутентификации».

+0

Спасибо! Но возможно ли внедрить свой собственный IPrinciple при работе с проверкой подлинности с помощью форм? Я попытался использовать пользовательскую проверку подлинности, но у меня нет доступа к сеансу (я хотел бы сохранить там свой пользовательский объект, который позже будет вложен в HttpContext.Current.User), и это проблема для меня. – dragonfly

+0

Вы можете временно сохранить свой объект аутентификации в контейнере 'Items', а затем скопировать его в контейнер сеанса, когда сеанс будет доступен (событие' AcquireRequestState'). –

0

Прежде чем вы это сделаете (создайте/внесите свои собственные), попробовали ли вы/рассмотрели возможность адаптации аутентификации форм к существующей схеме аутентификации?

Я думаю, что вы «почти там» (используя все встроенные ASP.net-аутентификацию/членство/профили/роли), и это возможно проще/проще просто «подключить» к существующему auth схемы в аутентификацию форм.

Это snippet of code должны дать вам представление о том, насколько гибких формах аутентификация может быть:

if ((UserEmail.Text == "[email protected]") && (UserPass.Text == "37Yj*99Ps")) 
{ 
     FormsAuthentication.RedirectFromLoginPage 
     (UserEmail.Text, Persist.Checked); 
} 
else 
{ ... } 

Таким образом, он работает с жестко закодированным «схемой Идента» (не то, что Вам необходимо, но дает представление о том, возможности), или даже список in 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> 

только мысль - НТН ....

+0

Все в порядке, но мне нужно сохранить свою собственную реализацию IPrinciple в HttpContext.Current.User. И я не знаю, возможно ли это с помощью Forms Auth. Благодаря! – dragonfly

Смежные вопросы