A partire dal modello di app Web ASP.NET 5 che utilizza account utente individuali, sono riuscito a ottenere l'autenticazione esterna con gli account Microsoft. Quando gli utenti fanno clic su Login, vengono reindirizzati a ExternalLogin
in AccountController
come questo
<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"/> Log In</button>
</form>
Questo li fa accedere con il loro account Microsoft e tutto sembra funzionare bene. Ma come posso intercettare i tentativi diretti di accedere ad azioni privilegiate [Authorize]
modo che l'utente venga reindirizzato a ExternalLogin
? È possibile impostare un'azione predefinita in Startup.cs
?
MODIFICA 1 Tentativo di seguire il consiglio di @ Yves Ho creato CustomAutorizationFilter
in una cartella Filtri. Non controlla eventuali condizioni
public class CustomAutorizationFilter : IAuthorizationFilter
{
public void OnAuthorization(Microsoft.AspNet.Mvc.Filters.AuthorizationContext context)
{
//if (...) // Check you conditions here
//{
context.Result = new RedirectToActionResult("ExternalLogin", "Account", null);
//}
}
}
e hanno modificato ConfigureServices
come di seguito
services.AddMvc(config =>
{
config.Filters.Add(typeof(Filters.CustomAutorizationFilter));
});
Quando eseguo l'app a livello locale, non si passa più alla pagina iniziale. Restituisce un http://localhost:52711/Account/ExternalLogin
Ovviamente c'è molto che non capisco.
Modifica 2: questa è la firma di ExternalLogin
// POST: /Account/ExternalLogin
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public IActionResult ExternalLogin(string provider, string returnUrl = null)
Ecco come ExternalLogin
esce dalla confezione nel modello di app Web ASP.Net 5.
Poiché non sono riuscito a far funzionare CustomAuthorizationFilter
come suggerito da @Yves, ho fatto ricorso a un brutto attacco. Ho modificato AccountController Login
come di seguito
// 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();
}
Questo sembra funzionare ma gradirei qualsiasi feedback o consiglio se c'è un modo migliore.
È possibile registrare un IAuthorizationFilter
o IAuthorizationFilter
IActionFilter
per realizzare questo. In questi filtri è possibile verificare se la richiesta sta tentando di accedere a un'azione privilegiata, se l'utente ha effettuato l'accesso o dispone di autorizzazioni sufficienti per farlo.
Se si utilizza AutorizeAttribute
, suggerisco di utilizzare AutorizationFilter
. Se vai con i tuoi attributi personalizzati, quindi utilizzare ActionFilter
.
Ecco un esempio:
MVC chiama il metodo IAuthorizationFilter.OnAuthorization
prima di ogni esecuzione di un'azione.
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);
}
}
}
Per registrare questo filtro, in Startup.cs modifica il tuo metodo ConfigureServices
:
services.AddMvc(config =>
{
config.Filters.Add(typeof(CustomAuthorizationFilter ));
});
Oppure, se vi volete utilizzare i propri attributi è possibile utilizzare ActionFilter
s' OnActionExecuting
metodo per controllare se tutto sta accadendo come si desidera ...