Как я могу вручную проверить авторизацию URL в MVC5?
IIS-Manager
IIS-ManagerЧтобы ограничить доступ к веб-приложению, администратор может установить URL-авторизацию пользователей и групп с помощью диспетчера IIS:
![IIS Autohrization Rules]()
Web.config
IIS-Manager сохраняет правила авторизации в файле web.config приложения:
<security>
<authorization bypassLoginPages="true">
<remove users="*" roles="" verbs="" />
<add accessType="Allow" users="Testuser" />
<add accessType="Deny" users="*" />
</authorization>
</security>
Когда для bypassLoginPages
установлено значение true
, всем пользователям разрешается доступ к странице входа в систему. Когда пользователь не вошел в систему, он автоматически будет перенаправлен на страницу входа:
<authentication mode="Forms">
<forms [...] loginUrl="~/Auth/Login" [...] >
[...]
</forms>
</authentication>
Приложение MVC5:
Пользователь должен войти в систему через пользовательскую страницу входа в систему под своим Windows SamAccountName и паролем. Учетные данные будут отправлены в действие Login
AuthController
:
[AllowAnonymous]
public class AuthController : Controller
{
public ActionResult Login
{
// validation of SamAccountName and Password against Active Directory here.
[...]
// We want to check the authorization here.
// create authentication ticket
FormsAuthenticationTicket lFormsAuthenticationTicket = new FormsAuthenticationTicket(1,
SamAccountName,
DateTime.Now,
DateTime.Now.AddMinutes(AuthCookieTimeout),
RememberMe,
CustomData,
FormsAuthentication.FormsCookiePath);
// Encrypt the ticket.
string lEncryptedTicket = FormsAuthentication.Encrypt(lFormsAuthenticationTicket);
var lAuthCookie = new HttpCookie(FormsAuthentication.FormsCookieName, lEncryptedTicket);
// Create the cookie.
Response.Cookies.Add(lAuthCookie);
[...]
return RedirectToAction("Index", "Main"); // redirect to the main controller
}
}
Все контроллеры с ограниченным доступом автоматически проверяют авторизацию с помощью атрибута [Authorize]
:
[Authorize]
public class MainController : Controller
{
[...]
}
Украшение типа [Authorize(Users="User1,User2")]
не является решением, потому что код недоступен для конечных пользователей, которые должны иметь возможность конфигурировать доступ к приложению.
Если пользователь не авторизован, он будет перенаправлен на страницу входа. Это отлично работает. Но мне нужно сделать проверку авторизации в действии Login
раньше. Итак, мой вопрос:
Как я могу вручную проверить в AuthController
, если вошедший в систему пользователь авторизован для перенаправления на MainController
?
Ответы
Ответ 1
Q: Как я могу вручную проверить в моем AuthController, если вошел в систему пользователь авторизован для перенаправления на MainController?
Поскольку вы используете атрибут Authorize
, вам не нужно проверять авторизацию вручную в действии. Вот некоторые правила:
- Ограничить доступ для аутентифицированных пользователей:
[Authorize]
- Ограничьте доступ некоторым конкретным пользователям:
[Authorize(Users="User1,User2")]
- Ограничьте доступ к некоторым конкретным ролям:
[Authorize(Roles="Administrators,PowerUsers")]
Поскольку вы украсили MainController
атрибутом Authorize
, это означает, что никто не может получить доступ к его действиям без входа в систему.
Таким образом, в действии Logon
вам не нужно проверять, авторизован ли пользователь для перенаправления на главный контроллер. Здесь нет никаких недостатков безопасности, и вам не нужно беспокоиться об авторизации при использовании RedirectToAction("Index", "Main")
.
Q: Определение в атрибуте Authorize не решит проблема. Как администраторы могут ограничивать пользователей и группы, когда они купить программное обеспечение? У тебя нет доступа к коду.
Роли созданы для такого требования. Вы должны использовать [Authorize(Roles="Role1")]
выше MainController
, и тогда каждый пользователь Role1
может получить доступ к действиям основного контроллера. Это может быть просто сделано в управлении пользователями и ролями вашего приложения. Итак:
- Во время разработки украсьте контроллеры и действия статическими ролями
- Во время выполнения вы можете управлять ролью пользователя, используя ваше приложение.
Примечание
В большинстве приложений роли статичны, и вы можете сказать, какая роль может иметь доступ к какому действию. В таких случаях текущего атрибута Authorize
будет достаточно для авторизации. Просто добавьте пользователей в роли во время выполнения. Identity Samples содержит необходимые модели, представления и контроллеры для этого.
В случае, если вы хотите создать новые роли во время выполнения или изменить разрешения роли во время выполнения, вам нужно создать новый атрибут Authorize
, который читает роль пользователя из файла конфигурации или базы данных, а также разрешения на чтение роли из файла конфигурации или базы данных и принять решение об авторизации.
Ответ 2
Вы не должны использовать тег <authorization>
в ASP.Net MVC. Он предназначен для веб-формы ASP.Net. Вы можете прочитать больше в fooobar.com/questions/175831/....
В ASP.Net MVC вы хотите использовать атрибут [Authorize]
. Кроме того, вы хотите использовать промежуточное ПО OWIN вместо старого FormsAuthenticationTicket.
У него мало частей, поэтому я создал образец проекта в GitHub AspNetMvcActiveDirectoryOwin. Исходным сусом является аутентификация с помощью AD, но вам просто нужно настроить класс ActiveDirectoryService.
Следующие три являются основными классами -
Ответ 3
Две опции,
Используйте параметр "Роли" под Authorize
следующим образом:
[Authorize(Roles="TestUsers,Admins")]
Затем добавьте пользователей, которым должен быть разрешен доступ к этому действию для этих ролей. Роли предоставляются как часть ClaimsPrincipal
, используемого ASP Identity.
Или, альтернативно, предоставите собственную реализацию атрибута Authorize
, который проверяет зарегистрированного пользователя во всех существующих бизнес-правилах, а затем разрешает или запрещает доступ.