ログインをコントローラのアクションにリダイレクトする

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

質問

個々のユーザーアカウントを使用してASP.NET 5 Webアプリケーションテンプレートを開始すると、Microsoftアカウントで外部認証を使用することができました。ユーザーがログインをクリックすると、このような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アカウントを使用してログインし、すべてがうまくいくように見えます。しかし、ユーザーがExternalLoginリダイレクトされるように、特権アクション[Authorize]への直接アクセスを傍受するにはどうすればよいですか? Startup.csデフォルトのアクションを設定できますか?

EDIT 1 @ Yvesのアドバイスに従おうとしています。私はFiltersフォルダにCustomAutorizationFilterを作成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 App TemplateのボックスのExternalLogin出ていく様子です。

受け入れられた回答

@Yvesによって提案されたようにCustomAuthorizationFilter動作させることができなかったので、私は厄介なハックに頼った。私は以下のようにAccountController Loginを変更し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();
    }

これはうまくいくようですが、より良い方法があれば、私はフィードバックやアドバイスを感謝します。


人気のある回答

IAuthorizationFilterまたはIActionFilter実装を登録して、これを実現できます。これらのフィルタでは、ユーザがログインしているか、権限を持っていれば、リクエストが特権アクションにアクセスしようとしているかどうかを確認できます。

使用している場合はAutorizeAttribute 、私はあなたが使用することをお勧めAutorizationFilter 。独自のカスタム属性を使用する場合は、 ActionFilterを使用し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 ));
});

または、あなた自身の属性を使用するのをActionFilterたい場合は、 ActionFilterOnActionExecutingメソッドを使用して、必要に応じてすべてが起きているかどうかを確認できます。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ