5

個々のユーザーアカウントを使用するASP.NET 5 Webアプリケーションテンプレートから、Microsoftアカウントで動作する外部認証を取得できました。ユーザーがログインをクリックすると、彼らは彼らがthierのMicrosoftアカウントを使用してログインし、すべてがうまく動作するようです取得します。このリダイレクトコントローラへのリダイレクトアクション

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

ようAccountControllerExternalLoginにリダイレクトされます。しかし、ユーザがExternalLoginにリダイレクトされるように、特権的なアクション[Authorize] への直接アクセスを傍受するにはどうすればよいですか? Startup.csにデフォルトのアクションを設定できますか?

EDIT 1 @ Yvesのアドバイスに従うと、私は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); 
     //} 
    } 
} 

をチェックしませんし、私はローカルでアプリケーションを実行すると、それはもはやホーム・ページに行く

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

以下のようConfigureServicesを編集していません。それは空白を返しますhttp://localhost:52711/Account/ExternalLogin

明らかに私は分かりません。

編集2:ここではこれがExternalLoginはASP.Net 5 Webアプリケーションテンプレートに箱から出てくる方法ですExternalLogin

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

の署名があります。

+0

編集後にリダイレクトループが発生することがあります。あなたの 'ExternalLogin'コントローラに' AllowAnonymousAttribute'を追加してみてください。その属性が 'IAuthorizationFilter'をバイパスしたと誤解されていなければ。デバッグして何が起きているのかを確認することができます。私はpcのATMではないです。だから私はそれを確認することはできません。 – Yves

+0

私の質問に「ExternalLogin」の署名を追加しました。 – Vague

+0

@Yvesはリダイレクトループについて正しいです。 'ExternalLogin' – Vague

答えて

2

CustomAuthorizationFilterは@Yvesによって提案されたように働くことができませんでしたので、私は厄介なハックに頼ってしまいました。これが動作しているようですが、良い方法があれば、私は任意のフィードバックやアドバイスをいただければと思います

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

私は以下のようにAccountController Loginを変更しました。

3

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

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ありがとうございました。これは' context.Result = new RedirectToActionResult( "ExternalLogin"、 "Account"、null);どのような条件がチェックされますか? 'if(!user.IsAuthorized)'のようなことについて話しているのですか、それとも別の意味ですか?私たちの設定はとてもシンプルです。私は、ログインしているのか、管理者の役割にいるのかを知りたいだけです。 – Vague

+0

ログインしていないユーザーをリダイレクトしたい場合は、 'IsAuthorized'だけで十分です。これは実際にあなたのビジネスロジックに依存しています;) – Yves

+0

ありがとうございます@ Yves。私はまだ私が望む結果を得ていない。あなたの助言に従うように私の質問を編集しました。 – Vague

関連する問題