Как работает тег авторизации? - ASP.NET MVC
Как авторизованный тег определяет, разрешен ли пользователь или нет?
Например, если пользователь входит в систему, и они пытаются перейти к представлению с тегом Authorize. Как определить, разрешен ли пользователь или нет? Выполняет ли запрос запрос к базе данных и проверяет?
Как насчет того, если они перейдут к представлению с авторизацией роли? Выполняет ли запрос таблицу роли членства?
Мне просто интересно, так как у меня есть то, что таблицы членства ASP.NET рассматривают дублирующиеся имена пользователей. Я использую серьезные поля, чтобы определить, какой пользователь является тем, что позволяет пользователям иметь одно и то же дублируемое имя пользователя, но все же быть уникальным в моей базе данных.
Это заставило меня написать специальные методы для множества элементов .NET-членства, поскольку все они использовали "userName" для выполнения поиска вместо использования UserId.
Итак, теперь мне интересно, может ли это быть в случае с тегом Authorize. Поскольку я понятия не имею, как это работает, и, как если бы я не использовал членство в .NET, я бы не имел понятия, как он его определит.
Ответы
Ответ 1
Тег Authorize
использует все встроенные проверки членства из ASP.NET. ОЧЕНЬ легко вставить свой собственный тег. Например:
public class MyAuthorize : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext == null) throw new ArgumentNullException("httpContext");
// Make sure the user is authenticated.
if (httpContext.User.Identity.IsAuthenticated == false) return false;
// Do you own custom stuff here
bool allow = CheckIfAllowedToAccessStuff();
return allow;
}
}
Затем вы можете использовать тег [MyAuthorize]
, который будет использовать ваши пользовательские проверки.
Ответ 2
ControllerActionInvoker анализирует атрибут и вызывает на нем OnAuthorization()
, когда он проверяет учетные данные.
Метод AuthorizationAttribute.OnAuthorization()
в основном проверяет, соответствует ли User.Identity.IsAuthenticated
true или нет. Это просто использует функциональность FormsAuthentication или любую другую схему аутентификации, которую вы можете использовать.