一段时间后登录失败,访问令牌连接失败NT AUTHORITY \ ANONYMOUS LOGON错误

时间:2019-01-11 01:45:25

标签: sql-server azure authentication mssql-jdbc

我在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)

1 个答案:

答案 0 :(得分:0)

您使用的令牌会过期,您没有在代码中指定任何令牌生存期,因此令牌生存期取决于系统默认值。