簡體   English   中英

Microsoft.Data.SqlClient.SqlException (0x80131904): 用戶登錄失敗 '<token-identified principal> '. 令牌已過期</token-identified>

[英]Microsoft.Data.SqlClient.SqlException (0x80131904): Login failed for user '<token-identified principal>'. Token is expired

我正在使用實體框架連接到 Azure SQL 數據庫,並且我正在使用訪問令牌(通過托管身份獲得)進行連接。

我沒有在 SQL 連接字符串中使用用戶名和密碼,也沒有使用托管身份並將 SQL 連接字符串保留在 Azure keyvault 中。

我正在使用如下所示的令牌連接到數據庫,但一個小時后它就過期了,所以我收到“SQL 登錄失敗 - ”錯誤。

一旦連接到數據庫,我有一個長時間運行的進程,它從一些表中收集一些配置數據,超過 45 分鍾后,我需要更新數據庫中的數據。 嘗試使用dbcontext保存更改時,代碼拋出此超時問題。

如何獲取新的刷新令牌並設置為連接?

public SqlConnection GetDBConnection()
{
    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = Environment.GetEnvironmentVariable("SqlConnectionString");

    var credential = new DefaultAzureCredential();
    var accessToken = credential.GetToken(new TokenRequestContext(new[] { "https://database.windows.net/.default" }));

    conn.AccessToken = accessToken.Token;

    return conn;
}

我們需要確保在作業完成之前連接不會關閉,並且當我們運行長進程時遇到任何連接問題時,它可能會過期。

因此,當我們在評論部分獲得一些見解以使用“USING”時。 這是可以做到的。

下面是我們如何使用它進行連接,主要用於 SQL:

using (SqlConnection conn = new SqlConnection(...))
{
    using(SqlCommand cmd = new SqlCommand(..., conn))
    {
        conn.Open();
        using(DataReader dr = cmd.ExecuteReader())  // or load a DataTable, ExecuteScalar, etc.    
        {
             ...
        {
    }
}

還要使用 Azure SQL 數據庫檢查AAD 身份驗證,因為我們已經看到令牌識別主體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM