Web アプリと Web API を使用した Azure AD を使用したマルチテナント ソリューションに取り組んでいます。Web アプリは、OpenIdConnect を使用して (Azure Redis Cache にキャッシュされている) ベアラー トークンを取得します。このトークンは、Web API から JSON を取得するために Angular で使用されます。ユーザーの偽装は、Web アプリと Web API (Azure AD アプリケーションで設定) の間で使用されます。
問題:
これは約 1 時間は正常に機能し、その後 Web API 側で ID が突然消えます。Web アプリを更新すると、ページが Microsoft ログイン ページにリダイレクトされていることがわかりますが、ユーザーは Web アプリにリダイレクトされるだけで、すべてが再び機能するため、何もする必要はありません。私が見る限り、Web アプリは失敗したときと更新後 (同じ有効期限) に再び動作するときに同じベアラー トークンを使用します。AuthenticationContext.AcquireTokenSilent は両方のシナリオで機能します。
さまざまなタイムアウトを増やしてみましたが、何も役に立ちませんでした。また、Web API でのベアラー トークン認証以外はすべて無効にしました。ID が消える理由と、クライアントの更新に役立つ理由がわかりません。何か案は?:)
追加情報
これは、(Web API での) ログインまたは更新の約 1 時間後に RequestContext.Principal.Identity がどのように見えるかを示しています。
そして、これは約 1 時間後です。これにより、認証が失敗します。
私が試したコードの変更のいくつか:
Web API HttpConfiguration で:
config.SuppressDefaultHostAuthentication();
config.Filters.Add(
new HostAuthenticationFilter(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions().AuthenticationType));
これにより、認証されていないプリンシパルが WindowsPrincipal から ClaimsPrincipal に変更されましたが、1 時間後にも失敗します。
WindowsAzureActiveDirectoryBearerAuthenticationOptions BackChannelTimeout set to 5 days. Still fails
Web アプリ web.config で:
sessionState timeout="525600" for RedisSessionStateProvider. Still fails
Web アプリの認証プロセスで、タイムスパンが増加し、スライド式の有効期限が追加されました。それでも失敗します:
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
CookieSecure = CookieSecureOption.Always,
ExpireTimeSpan = TimeSpan.FromDays(5),
SlidingExpiration = true,
CookieHttpOnly = true
});
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = ClientId,
Authority = Constants.CommonAuthority,
UseTokenLifetime = false
アップデート:
いくつかの詳細を具体化するには: ハイブリッド MVC Angular Web アプリケーションがあります。それぞれがそのメニュー項目のAngular「シングルページアプリケーション」につながる多くのMVCメニュー項目。MVC は、ルーティング、認証、承認に使用されます。さらに、追加のクレームが取得され、現在のプリンシパル サーバー側に追加されます。メニュー項目は、Authorized および ClaimsPrincipalPermission 属性で保護されている MVC コントローラーです。Web ページは Azure で実行されるため、既定の sessionProvider を Microsoft.Web.Redis.RedisSessionStateProvider に変更しました。MVC サーバー側のみがこの redis セッション キャッシュと通信します。ベアラー トークン (リフレッシュ トークンではない) は、認可された保護された MVC コントローラーを介して Angular と共有され、ブラウザー セッション ストレージに格納されます (adal. js は localstorage を使用しますか?) Angular は、MVC アプリとは別のドメインにある CORS 対応 API から JSON コンテンツを取得します。API と MVC アプリも、2 つの異なる Azure AD アプリケーションに属しています。