5

使用個人用戶帳戶從ASP.NET 5 Web App模板開始我設法使用Microsoft帳戶獲得外部身份驗證。當用戶點擊登錄,他們將被重定向到ExternalLoginAccountController這樣重定向登錄到控制器操作

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

這讓他們在使用微軟thier帳戶登錄和一切似乎很好地工作。但是,如何攔截直接訪問特權操作[Authorize] ,以便用戶重定向到ExternalLogin?可以在Startup.cs中設置默認操作嗎?

編輯1試圖按照@ Yves的建議,我在Filters文件夾中創建了CustomAutorizationFilter。它不檢查任何條件

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

,並編輯ConfigureServices如下

 services.AddMvc(config => 
     { 
      config.Filters.Add(typeof(Filters.CustomAutorizationFilter)); 
     }); 

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

顯然有很多我不明白。

編輯2:這裏是ExternalLogin

// POST: /Account/ExternalLogin 
    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public IActionResult ExternalLogin(string provider, string returnUrl = null) 

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

+0

我想你編輯後可能會有重定向循環。嘗試將'AllowAnonymousAttribute'添加到'ExternalLogin'控制器。如果我沒有弄錯那個屬性繞過'IAuthorizationFilter'。你可以調試它看看發生了什麼。我不是在一臺電腦的自動櫃員機。所以我無法檢查它。 – Yves

+0

我已將「ExternalLogin」的簽名添加到我的問題中。 – Vague

+0

@Yves關於重定向循環是正確的。它通過保持'context.Result =新RedirectToActionResult( 「ExternalLogin」, 「帳戶」,NULL)循環;'不會去訪問'ExternalLogin' – Vague

回答

2

因爲我無法得到CustomAuthorizationFilter工作正如@Yves建議我使用了一個討厭的黑客。我已經修改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(); 
    } 

這似乎是工作,但我會很感激任何意見或建議是否有更好的辦法。

3

您可以註冊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方法:

services.AddMvc(config => 
{ 
    config.Filters.Add(typeof(CustomAuthorizationFilter)); 
}); 

或者,如果你婉使用您自己的屬性,你可以使用ActionFilterOnActionExecuting方法來檢查,如果一切發生,因爲你希望...

+0

謝謝@Yves。什麼條件被檢查?你是在談論像'if(!user.IsAuthorized)'還是你的意思是別的?我們的設置非常簡單;我只想知道他們是否已登錄,或者他們是否在管理員角色中。 – Vague

+0

如果你只是想在用戶中重定向unlogged,那麼'IsAuthorized'就夠了。這真的取決於你的業務邏輯;) – Yves

+0

再次感謝@Yves。我仍然沒有得到我期望的結果。我編輯了我的問題,以包括我試圖遵循您的建議。 – Vague

相關問題