匿名アクセスと名前付きユーザー アカウントを許可するフレームワークがあります。特定の URL で OData リソースを公開しています。そのように構成すると、匿名ユーザーはリソースの一部を表示でき、(基本認証を介して) ログインしているユーザーはより多くのリソースを表示できます。
私が直面している問題は、一部の OData クライアント (Excel など) が、資格情報を提供した場合でも、最初は匿名で OData リソースにアクセスしようとすることです。これが失敗した場合にのみ、提供された資格情報が使用されます。私の理解では、これはログインする方法がたくさんあり、一部のクライアントは常に最も基本的なオプションを最初に試すためです. ただし、これにより、提供された資格情報を使用することはなく、リソースが匿名アクセスを許可している場合に認証チャレンジを取得することもないため、実際にはより多くのデータを見ることができなくなります。
この問題を解決して、匿名アクセスを許可し、可能な場合は認証チャレンジを適切に送信する方法はありますか? クライアントが資格情報を持っているが、最初は資格情報を提供していないときに送信するヘッダーがいくつかありますか?
これをもう少し具体的にするための (scala) コード:
val (username, password) = getAuthInfo(request)
if (username != null && password != null) {
val regularSession = integration.core.login(username, password)
logger.debug(s"Login OK: User '$username' (Number of concurrent sessions: ${integration.core.getNumberConcurrentSessions}).")
(IMxRuntimeResponse.OK, null, regularSession)
} else if (integration.configuration.getEnableGuestLogin) {
val guestSession = integration.core.initializeGuestSession
logger.debug(s"Anonymous user '${guestSession.getUser.getName}' created " +
"(Number of concurrent sessions: ${integration.core.getNumberConcurrentSessions}).")
(IMxRuntimeResponse.OK, null, guestSession)
} else {
val responseMessage = "No basic authentication in header."
logger.warn(s"Login failed: $responseMessage")
(IMxRuntimeResponse.UNAUTHORIZED, responseMessage, null)
}
周囲の try/catch の外側のどこか:
if (httpStatusCode == IMxRuntimeResponse.UNAUTHORIZED)
response.addHeader("WWW-Authenticate", "Basic")
ご覧のとおり、匿名アクセスが許可されている場合、チャレンジは送信されません。
編集: 調査したところ、このリクエストのヘッダーには、これが別の匿名ログイン試行ではなく、認証チャレンジが送信されたときに別のリクエストが発生する最初の試行であることを示す特別なものはないようです。私たちは今ここでどう進めてよいか途方に暮れています。