Недавно мне дали задание создать отдельный логин для пользователей, которые принадлежат к определенной роли. Вход уже был реализован для основных пользователей, и это было сделано с использованием принципала, который был назначен Thread.CurrentPrincipal
и позже проверяется на значение каждый раз при загрузке страницы. Я изменил свой код, чтобы использовать тот же механизм аутентификации, поэтому в моем пользовательском входе в систему я создаю пользовательского Принципала и назначаю его Thread.CurrentPrincipal
. Теперь проблема в том, что при настраиваемом входе в систему я переопределяю свой обычный вход и наоборот. Можно ли назначить мой принцип где-нибудь еще, кроме Thread.CurrentPrincipal
, чтобы оба варианта входа работали одновременно? Если это невозможно, я хотел бы узнать об альтернативах :)
Возможно ли иметь более одного участника в ASP.NET?
Ответы (2)
Это очень выполнимо и не очень сложно. Лучший способ, который я нашел для этого, - реализовать собственный IPrincipal, у которого есть свойство, которое также содержит IPrincipal. Затем вы можете сохранить оба объекта в потоке и реализовать метод IsInRole таким образом, чтобы можно было проверять оба объекта-участника для целей авторизации. Какой-то псевдокод ...
public class MyPrincipal : IPrincipal
{
public IPrincipal FormsPrincipal { get; private set; }
public MyPrincipal(IPrincipal formsPrincipal)
{
FormsPrincipal = formsPrincipal;
}
public bool IsInRole(string role)
{
if (someCondition)
{
// check roles for this
}
else
{
return FormsPrincipal.IsInRole(role); // check role against the other principal
}
}
}
Затем в PostAuthenticateRequest используйте текущего участника для создания нового настраиваемого участника и назначьте его в качестве участника HttpContext.Current.
Хороший ресурс с большим количеством деталей: ASP.NET MVC - Установите пользовательский IIdentity или IPrincipal
Ответ от DVK действителен, но в прошлом у меня были сложности при использовании пользовательских IPrincipal
s. Альтернативный подход - использовать одного участника, представленного ClaimsPrincipal
, и использовать тот факт, что он может хранить несколько идентификаторов. Затем вы можете использовать, например, реализации по умолчанию IsInRole
.
https://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal(v=vs.110).aspx