重定向登錄到控制器操作


從使用個人用戶帳戶的ASP.NET 5 Web應用程序模板開始,我已設法使用Microsoft帳戶進行外部身份驗證。當用戶單擊Login時,他們將被重定向到AccountController 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>

這讓他們使用他們的Microsoft帳戶登錄,所有似乎都運行良好。但是,如何攔截直接嘗試訪問特權操作[Authorize]以便將用戶重定向到ExternalLogin ?可以在Startup.cs設置默認操作嗎?

編輯1嘗試遵循@Yves的建議我在Filters文件夾中創建了CustomAutorizationFilter 。它不會檢查任何條件

<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>

並編輯了ConfigureServices ,如下所示

<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>

當我在本地運行應用程序時,它不再進入主頁。它返回一個空白的http://localhost:52711/Account/ExternalLogin

顯然有很多我不明白。

編輯2:這是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>

這是怎麼ExternalLogin出來,在ASP.Net 5 Web應用程序模板的開箱。

一般承認的答案

因為我無法按照@Yves的建議讓CustomAuthorizationFilter工作,所以我採取了令人討厭的黑客行為。我已經修改了AccountController Login ,如下所示

     // 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();
    }

這似乎有效,但如果有更好的方法,我會感激任何反饋或建議。


熱門答案

您可以註冊IAuthorizationFilterIActionFilter實現來完成此任務。在這些過濾器中,您可以檢查請求是否嘗試訪問特權操作(如果用戶已登錄或具有足夠的權限)。

如果您使用的是AutorizeAttribute ,我建議您使用AutorizationFilter 。如果您使用自己的自定義屬性,請使用ActionFilter

這是一個例子:

MVC在每個動作執行之前調用IAuthorizationFilter.OnAuthorization方法。

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);
        }
    }
}

要註冊此過濾器,請在Startup.cs中編輯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);
        }
    }
}

或者,如果您想使用自己的屬性,可以使用ActionFilterOnActionExecuting方法檢查是否一切都按照您的意願發生......





許可下: CC-BY-SA
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因