我在Azure App服务上有一个Spring Web应用程序,该应用程序正在使用Microsoft JDBC驱动程序连接到Azure SQL DB,并使用访问令牌进行身份验证。最初可以找到它,但是一段时间后我开始获取SQLServerException:用户'NT AUTHORITY \ ANONYMOUS LOGON'登录失败
我正在按照MS docs中概述的步骤进行操作。
AuthenticationContext context = new AuthenticationContext(mySTSUrl, false, Executors.newFixedThreadPool(1));
ClientCredential cred = new ClientCredential(myClientId, myClientSecret);
Future<AuthenticationResult> future = context.acquireToken("https://database.windows.net/", cred, null);
String accessToken = future.get().getAccessToken();
// Connect with the access token.
ds = new SQLServerDataSource();
ds.setServerName(myServer); // Replace with your server name.
ds.setDatabaseName(myDB); // Replace with your database name.
ds.setEncrypt(true);
ds.setAccessToken(accessToken);
ds.setHostNameInCertificate("*.database.windows.net");
ds.setTrustServerCertificate(false);
ds.setLoginTimeout(30);
这一切都在一段时间内起作用(没有固定确切的时间或触发器),然后开始失败,并显示以下信息:
原因:
com.microsoft.sqlserver.jdbc.SQLServerException:用户登录失败 “ NT AUTHORITY \ ANONYMOUS LOGON”。 ClientConnectionId:connectionid已编辑于 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:259) 在 com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:256) 在com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:108) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:4548) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:3409) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.access $ 100(SQLServerConnection.java:85) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection $ LogonCommand.doExecute(SQLServerConnection.java:3373) 在 com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7344) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2713) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:2261) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:1921) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:1762) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1077) 在 com.microsoft.sqlserver.jdbc.SQLServerDataSource.getConnectionInternal(SQLServerDataSource.java:1031) 在 com.microsoft.sqlserver.jdbc.SQLServerDataSource.getConnection(SQLServerDataSource.java:69) 在 org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) 在 org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:35) 在 org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:106)
答案 0 :(得分:0)
您使用的令牌会过期,您没有在代码中指定任何令牌生存期,因此令牌生存期取决于系统默认值。