0

良い一日、コア2.0 SignInManager.IsSignedIn

私は、この問題で困惑しています。私のアプリは2つのサインインオプションを持っています(1つはAzure ADを内部ユーザ用に呼び出し、もう1つは外部ユーザ用にIDを使用して登録/ログインする)。 (私はアプリの主張データベースからADユーザーにクレームを追加するためにClaimsTransformerを使用

私_LoginPartialは、次のようになります。これは、コア1.1で所望の効果を生み出し

@if (SignInManager.IsSignedIn(User)) 

     { 
      ... display @User.GetFirstName() and log out button 
... 
} 

    else if (User.Identity.IsAuthenticated) 
    { 
    ... Display AD's @User.Claims.First(c => c.Type == ClaimTypes.GivenName).Value and sign out button 
} 

else 
{ 
       <ul class="nav navbar-nav ml-auto"> 
        <li class="nav-item"><a asp-area="" asp-controller="Account" asp-action="Register" class="nav-link">Register</a> 
        </li> 
        <li class="nav-item"><a asp-area="" asp-controller="Account" asp-action="SignIn" class="nav-link">Internal Log in</a> 
        </li> 
        <li class="nav-item"><a asp-area="" asp-controller="Account" asp-action="Login" class="nav-link">External Log in</a> 
        </li> </ul> 
} 

しかし、今私が見えることはできません。外部のサインインのために以前に起こったことです( SignInManager.IsSignedIn(User)がtrueを返すように取得する

Startup.csはそうのようになります。

services.AddIdentity<ApplicationUser, IdentityRole>(options => 

      { 
       ... 
      }) 
      .AddEntityFrameworkStores<JCContext>() 
      .AddDefaultTokenProviders(); 

     services.ConfigureApplicationCookie(options => options.LoginPath = "/Account/LogIn"); 

     services.AddAuthentication(o => 
      { 
       o.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; 
       o.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; 
       o.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; 
      }) 

      .AddOpenIdConnect(option => 
      { 
       option.ClientId = Configuration["Authentication:AzureAD:ClientId"]; 
       option.Authority = Configuration["Authentication:AzureAd:Authority"]; 
       option.CallbackPath = Configuration["Authentication:AzureAd:CallbackPath"]; 

      }) 
      .AddCookie(o => 
      { 
       o.LoginPath = new PathString("/Account/LogIn"); 
       o.ExpireTimeSpan = TimeSpan.FromDays(150); 
       o.LogoutPath = "/Account/LogOut"; 
      }); 

面白いのは、services.AddAuthentication(...)の前にservices.AddIdentityの前に置くと、逆の効果が得られます。私の外部ユーザーは「サインイン」を表示することができますが、はADユーザーのログイン時にtrueを返しません。

起動時にアイテムを前後に並べ替えていますが、私は明白な何かを見逃していますか?私が理解していないSignInManager /クッキーに関するものがなければなりません。

ありがとうございました。

+0

'App.UseIdentity'を' Configure'メソッドの 'app.UseAuthentication()'に置き換えましたか? – zulq

+0

私は本当にありました。それはしばらくかかったが、私は最終的には、他のすべての作業を(今のところ!)得るために、アプリケーションをアップグレードしました。 – Mikustykus

+0

多分あなた自身の質問に答えて将来他人を助けることができます。 – zulq

答えて

0

私はAzure ADと統合するためのプロジェクトを作成し、それに適した個々のアカウントも作成します。そして、ここにConfigureServicesメソッドのコードです。

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddDbContext<ApplicationDbContext>(options => 
     options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

    services.AddIdentity<ApplicationUser, IdentityRole>() 
     .AddEntityFrameworkStores<ApplicationDbContext>() 
     .AddDefaultTokenProviders(); 

    services.AddMvc() 
     .AddRazorPagesOptions(options => 
     { 
      options.Conventions.AuthorizeFolder("/Account/Manage"); 
      options.Conventions.AuthorizePage("/Account/Logout"); 
     }); 

    // Register no-op EmailSender used by account confirmation and password reset during development 
    // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=532713 
    services.AddSingleton<IEmailSender, EmailSender>(); 

    services.AddAuthentication(options => 
    { 
     options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; 
     options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; 
    }) 
    .AddCookie() 
    .AddOpenIdConnect(options => 
    { 
     options.Authority = String.Format(Configuration["AzureAd:AadInstance"], Configuration["AzureAd:Tenant"]); 
     options.ClientId = Configuration["AzureAd:ClientId"]; 
    }); 
} 

私はまた、あなたがthis linkからそれをダウンロードして、あなたのコードで違いを比較することができ、GitHubのにデモプロジェクトをアップロードしています。

+0

ありがとう、これは知っていることは素晴らしいです!だから、これは奇妙です、私はあなたのソリューションを引っ張って、私の資格情報を差し込み、それはちょうど私が望むようにうまく動作します。 奇妙なことが私のところで起こっている。あなたのスタートアップに続いて、私はAzureでサインインすると外部ログインを得ることができますが、制限されたビューにアクセスしようとすると無限ループに襲われるようです。説明するのは難しいですが、一番上にサインインして、リダイレクトしてからもう一度試し続けます。 – Mikustykus

+0

この問題のトラブルシューティングに役立つデモコードを共有してもよろしいですか? –

+0

うまくいけば、[ここ](https://github.com/mikustykus/SampleProject/tree/a788ef600d5162956647c03fc633e4d26a3f57f4/src/JC)から抜き出すことができ、DB文字列といくつかのIDキーを差し込むと、この永遠のリダイレクトシナリオを再現することができます。オープンIDで「サインイン」した場合は、「承認済みエリア」にアクセスしてみてください。私にとっては空白になりますが、ネットワークタブのクロムを調べることでこの面白い動作が示されます。 (それはアイデンティティのログインでうまくいく)。それはおそらく何か明白ですが、何が原因であるかを知りたいのですが(修正がある場合) – Mikustykus

関連する問題