Surpreende-me como não consegui encontrar um exemplo claro de como autenticar um usuário desde a tela de login até o uso do atributo Authorize nos meus métodos ApiController após várias horas pesquisando no Google.
Isso ocorre porque você está ficando confuso com esses dois conceitos:
A autenticação é o mecanismo pelo qual os sistemas podem identificar com segurança seus usuários. Os sistemas de autenticação fornecem respostas para as perguntas:
- Quem é o usuário?
- O usuário é realmente quem ele / ela representa?
Autorização é o mecanismo pelo qual um sistema determina qual nível de acesso um usuário autenticado específico deve ter para proteger recursos controlados pelo sistema. Por exemplo, um sistema de gerenciamento de banco de dados pode ser projetado para fornecer a certos indivíduos especificados a capacidade de recuperar informações de um banco de dados, mas não a capacidade de alterar dados armazenados no banco de dados, enquanto oferece a outros indivíduos a capacidade de alterar dados. Os sistemas de autorização fornecem respostas para as perguntas:
- O usuário X está autorizado a acessar o recurso R?
- O usuário X está autorizado a executar a operação P?
- O usuário X está autorizado a executar a operação P no recurso R?
O Authorize
atributo no MVC é usado para aplicar regras de acesso, por exemplo:
[System.Web.Http.Authorize(Roles = "Admin, Super User")]
public ActionResult AdministratorsOnly()
{
return View();
}
A regra acima permitirá que apenas usuários nas funções de administrador e superusuário acessem o método
Essas regras também podem ser definidas no arquivo web.config, usando o location
elemento Exemplo:
<location path="Home/AdministratorsOnly">
<system.web>
<authorization>
<allow roles="Administrators"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
No entanto, antes que essas regras de autorização sejam executadas, você deve estar autenticado no site atual .
Embora eles expliquem como lidar com solicitações não autorizadas, elas não demonstram claramente algo como um LoginController ou algo parecido para solicitar credenciais de usuário e validá-las.
A partir daqui, poderíamos dividir o problema em dois:
Autenticar usuários ao consumir os serviços de API da Web no mesmo aplicativo da Web
Essa seria a abordagem mais simples, porque você confiaria na autenticação no ASP.Net
Este é um exemplo simples:
Web.config
<authentication mode="Forms">
<forms
protection="All"
slidingExpiration="true"
loginUrl="account/login"
cookieless="UseCookies"
enableCrossAppRedirects="false"
name="cookieName"
/>
</authentication>
Os usuários serão redirecionados para a rota da conta / login , onde você processaria controles personalizados para solicitar credenciais do usuário e, em seguida, você definiria o cookie de autenticação usando:
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
Autenticação multiplataforma
Nesse caso, você estaria apenas expondo os serviços de API da Web no aplicativo Web; portanto, você teria outro cliente consumindo os serviços, o cliente poderia ser outro aplicativo da Web ou qualquer aplicativo .Net (Win Forms, WPF, console, serviço do Windows, etc)
Por exemplo, suponha que você consumirá o serviço de API da Web de outro aplicativo Web no mesmo domínio de rede (dentro de uma intranet); nesse caso, você poderá confiar na autenticação do Windows fornecida pelo ASP.Net.
<authentication mode="Windows" />
Se seus serviços estiverem expostos na Internet, você precisará passar os tokens autenticados para cada serviço de API da Web.
Para mais informações, consulte os seguintes artigos: