Redirigir inicio de sesión a la acción del controlador

asp.net-core asp.net-core-mvc asp.net-identity-3 entity-framework-core

Pregunta

Comenzando con la plantilla de aplicación web ASP.NET 5 usando cuentas de usuario individuales, logré que la autenticación externa funcionara con las cuentas de Microsoft. Cuando los usuarios hacen clic en Iniciar sesión, se les redirige a ExternalLogin en AccountController como este

<form asp-controller="Account" asp-action="ExternalLogin" method="post" asp-route-returnurl="@ViewData["ReturnUrl"]" class="nav navbar-right">
    <button type="submit" class="btn btn-null nav navbar-nav navbar-right" name="provider" value="Microsoft" title="Log in"><span class="fa fa-sign-in"/>&nbsp; Log In</button>
</form>

Eso les permite iniciar sesión con su cuenta de Microsoft y todo parece funcionar bien. Pero, ¿cómo intercepto los intentos directos de acceder a acciones privilegiadas [Authorize] para que el usuario sea redirigido a ExternalLogin ? ¿Se puede establecer una acción predeterminada en Startup.cs ?

EDITAR 1 Intentando seguir los consejos de @Yves, he creado CustomAutorizationFilter en una carpeta de filtros. No verifica ninguna condición.

<form asp-controller="Account" asp-action="ExternalLogin" method="post" asp-route-returnurl="@ViewData["ReturnUrl"]" class="nav navbar-right">
    <button type="submit" class="btn btn-null nav navbar-nav navbar-right" name="provider" value="Microsoft" title="Log in"><span class="fa fa-sign-in"/>&nbsp; Log In</button>
</form>

y han editado ConfigureServices siguiente manera

<form asp-controller="Account" asp-action="ExternalLogin" method="post" asp-route-returnurl="@ViewData["ReturnUrl"]" class="nav navbar-right">
    <button type="submit" class="btn btn-null nav navbar-nav navbar-right" name="provider" value="Microsoft" title="Log in"><span class="fa fa-sign-in"/>&nbsp; Log In</button>
</form>

Cuando ejecuto la aplicación localmente, ya no va a la página de inicio. Devuelve un http://localhost:52711/Account/ExternalLogin blanco http://localhost:52711/Account/ExternalLogin

Obviamente hay mucho que no entiendo.

Edit 2: Aquí está la firma de ExternalLogin

<form asp-controller="Account" asp-action="ExternalLogin" method="post" asp-route-returnurl="@ViewData["ReturnUrl"]" class="nav navbar-right">
    <button type="submit" class="btn btn-null nav navbar-nav navbar-right" name="provider" value="Microsoft" title="Log in"><span class="fa fa-sign-in"/>&nbsp; Log In</button>
</form>

Así es como ExternalLogin sale de la caja en la plantilla de aplicación web ASP.Net 5.

Respuesta aceptada

Como no CustomAuthorizationFilter hacer que CustomAuthorizationFilter funcionara según lo sugerido por @Yves, he recurrido a un truco desagradable. He modificado el AccountController Login siguiente manera

     // GET: /Account/Login
    [HttpGet]
    [AllowAnonymous]
    public IActionResult Login(string returnUrl = null)
    {
        ViewData["ReturnUrl"] = returnUrl;
        return RedirectToAction(nameof(ExternalLogin), new { provider = "Microsoft", returnUrl = returnUrl });
        //return View();
    }

Esto parece funcionar pero agradecería cualquier comentario o consejo si hay una mejor manera.


Respuesta popular

Puede registrar un IAuthorizationFilter o implementaciones IActionFilter para lograr esto. En estos filtros, puede verificar si la solicitud está intentando acceder a una acción privilegiada, si el usuario ha iniciado sesión o tiene suficiente permiso para hacerlo.

Si está utilizando AutorizeAttribute , le sugiero que utilice AutorizationFilter . Si va con sus propios atributos personalizados, use ActionFilter .

Aquí hay un ejemplo:

MVC llama IAuthorizationFilter.OnAuthorization método IAuthorizationFilter.OnAuthorization antes de cada ejecución de acción.

public class CustomAuthorizationFilter : IAuthorizationFilter
{
    public void OnAuthorization(Microsoft.AspNet.Mvc.Filters.AuthorizationContext context)
    {
        if (...) // Check you conditions here
        {
            context.Result = new RedirectToActionResult("ExternalLogin", "Account", null);
        }
    }
}

Para registrar este filtro, en Startup.cs edite su método ConfigureServices :

public class CustomAuthorizationFilter : IAuthorizationFilter
{
    public void OnAuthorization(Microsoft.AspNet.Mvc.Filters.AuthorizationContext context)
    {
        if (...) // Check you conditions here
        {
            context.Result = new RedirectToActionResult("ExternalLogin", "Account", null);
        }
    }
}

O si usted wan para utilizar sus propios atributos que se pueden utilizar ActionFilter 's OnActionExecuting método para comprobar si todo está sucediendo como desee ...




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué