1

私は、Azure ADで認証するためのASP Net Core 2.0プロジェクトをセットアップしました(OIDCを使用するVS2017の標準Azure AD Identity認証テンプレートを使用します)。すべて正常に動作しており、アプリケーションはベースURL(/)に戻り、認証が成功した後にHomeController.Indexアクションを実行します。Azure AD認証の後にASP NetコアMVCの別のコントローラアクションにリダイレクトする方法

しかし、認証後に別のコントローラアクション(AccountController.CheckSignIn)にリダイレクトして、ローカルデータベーステーブルにユーザーが既に存在するかどうかをチェックし、そうでなければ(つまり新しいユーザー)ローカルホームレコードにリダイレクトし、HomeController.Indexアクションにリダイレクトします。

HomeController.Indexアクション自体にこのチェックを入れることができますが、ユーザーがホームボタンをクリックするたびにこのチェックが実行されないようにします。ここで

はappsettings.json

"AzureAd": { 
    "Instance": "https://login.microsoftonline.com/", 
    "Domain": "<my-domain>.onmicrosoft.com", 
    "TenantId": "<my-tennant-id>", 
    "ClientId": "<my-client-id>", 
    "CallbackPath": "/signin-oidc" // I don't know where this goes but it doesn't exist anywhere in my app and authentication fails if i change it 
} 

AADの設定は、私はこの要件を処理するために、私のAccountController.CheckSignInに新しいアクションを追加...明快さを与えるのを助けるかもしれないいくつかのコードスニペットですが、I認証後にそれを呼び出す方法を見つけることができません。

public class AccountController : Controller 
{ 
    // I want to call this action after authentication is successful 
    // GET: /Account/CheckSignIn 
    [HttpGet] 
    public IActionResult CheckSignIn() 
    { 
     var provider = OpenIdConnectDefaults.AuthenticationScheme; 
     var key = User.FindFirstValue(ClaimTypes.NameIdentifier); 
     var info = new ExternalLoginInfo(User, provider, key, User.Identity.Name); 
     if (info == null) 
     { 
      return BadRequest("Something went wrong"); 
     } 

     var user = new ApplicationUser { UserName = User.Identity.Name }; 
     var result = await _userManager.CreateAsync(user); 
     if (result.Succeeded) 
     { 
      result = await _userManager.AddLoginAsync(user, info); 
      if (!result.Succeeded) 
      { 
       return BadRequest("Something else went wrong"); 
      } 
     } 

     return RedirectToAction(nameof(HomeController.Index), "Home"); 
    } 

    // This action only gets called when user clicks on Sign In link but not when user first navigates to site 
    // GET: /Account/SignIn 
    [HttpGet] 
    public IActionResult SignIn() 
    { 
     return Challenge(
      new AuthenticationProperties { RedirectUri = "/Account/CheckSignIn" }, OpenIdConnectDefaults.AuthenticationScheme); 
    } 

} 

答えて

1
私は次のようにリダイレクトを使用して動作させるための方法を発見した

...

インサイドスタートアップ

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "default", 
     template: "{controller=Account}/{action=SignIn}/{id?}"); 
}); 

インサイドAccountController

// GET: /Account/CheckSignIn 
[HttpGet] 
[Authorize] 
public IActionResult CheckSignIn() 
{ 
    //add code here to check if AzureAD identity exists in user table in local database 
    //if not then insert new user record into local user table 

    return RedirectToAction(nameof(HomeController.Index), "Home"); 
} 

// 
// GET: /Account/SignIn 
[HttpGet] 
public IActionResult SignIn() 
{ 
    return Challenge(
     new AuthenticationProperties { RedirectUri = "/Account/CheckSignIn" }, OpenIdConnectDefaults.AuthenticationScheme); 
} 

インサイドAzureAdServiceCollectionExtensions(.NETのコア2.0)

private static Task RedirectToIdentityProvider(RedirectContext context) 
{ 
    if (context.Request.Path != new PathString("/")) 
    { 
     context.Properties.RedirectUri = new PathString("/Account/CheckSignIn"); 
    } 
    return Task.FromResult(0); 
} 
+0

あなたは正しい仕事のために適切なツールを使うことを提唱しているようです。私はそれが好きです。 – JasonInVegas

1

デフォルトの動作は次のとおりです。ユーザーは元のページにリダイレクトされます。例えば、ユーザは認証されず、アクセスされたインデックスページは、認証された後、インデックスページにリダイレクトされます。ユーザーは認証されておらず、連絡先ページにアクセスし、認証後、連絡先ページにリダイレクトされます。回避策として

、あなたが特定のコントローラ/アクションにユーザーをリダイレクトするために、既定のWebサイトのルートを変更することができます。カスタム・ロジックの後

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "default", 
     template: "{controller=Account}/{action=CheckSignIn}/{id?}" 
    ); 
}); 

、あなたは本当にデフォルトページ(ホーム/インデックス)にユーザーをリダイレクトすることができ。

+0

私はその単純さのためにこのアプローチが好きですが、ユーザが特定のページ(すなわち、Home/Contact)を読み込んだ場合はどうなりますか? Home/Contactページを直接ロードすると、Account/CheckSignInアクションが最初に呼び出されるようにするにはどうすればよいですか? – OjM

+0

コントローラーやアクションを保護するために[Authorize]属性を使用しましたか?あなたがそれを使用する場合、使用は、紺碧広告のログインページにリダイレクトする必要があります、認証後、彼はアカウント/ CheckSignInにリダイレクトされます。 –

+0

はい[Authorize]属性を使用しています。問題は、既定のルート設定が表示されている場合、この方法は既定のサイト(つまりmysite.com)を読み込む場合にのみ機能することです。しかし、私がurl mysite.com/Home/Aboutを入力すると、デフォルトルートはバイパスされ、Account/CheckSignInは決して呼び出されません。これを回避する方法はありますか? – OjM

関連する問題