EF Core を使用して、Azure App Services にデプロイされた Azure SQL データベースに接続しています。アクセス トークン (マネージド ID 経由で取得) を使用して、Azure SQL データベースに接続しています。
私がそれをやっている方法は次のとおりです:
スタートアップ.cs:
public void ConfigureServices(IServiceCollection services)
{
//code ignored for simplicity
services.AddDbContext<MyCustomDBContext>();
services.AddTransient<IDBAuthTokenService, AzureSqlAuthTokenService>();
}
カスタムDBコンテキスト.cs
public partial class MyCustomDBContext : DbContext
{
public IConfiguration Configuration { get; }
public IDBAuthTokenService authTokenService { get; set; }
public CortexContext(IConfiguration configuration, IDBAuthTokenService tokenService, DbContextOptions<MyCustomDBContext> options)
: base(options)
{
Configuration = configuration;
authTokenService = tokenService;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
SqlConnection connection = new SqlConnection();
connection.ConnectionString = Configuration.GetConnectionString("defaultConnection");
connection.AccessToken = authTokenService.GetToken().Result;
optionsBuilder.UseSqlServer(connection);
}
}
AzureSqlAuthTokenService.cs
public class AzureSqlAuthTokenService : IDBAuthTokenService
{
public async Task<string> GetToken()
{
AzureServiceTokenProvider provider = new AzureServiceTokenProvider();
var token = await provider.GetAccessTokenAsync("https://database.windows.net/");
return token;
}
}
これは正常に動作し、データベースからデータを取得できます。ただし、これが正しい方法であるかどうかはわかりません。
私の質問:
- これは正しい方法でしょうか、それともパフォーマンスに問題が生じますか?
- トークンの有効期限について心配する必要がありますか? 現時点ではトークンをキャッシュしていません。
- EF Core にはこれを処理するより良い方法がありますか?
ベストアンサー1
これは正しい方法でしょうか、それともパフォーマンスに問題が生じますか?
それが正しい方法です。OnConfiguring は新しい DbContext ごとに呼び出されるため、長期間有効な DbContext インスタンスがないと仮定すると、これが正しいパターンです。
トークンの有効期限について心配する必要がありますか? 現時点ではトークンをキャッシュしていません。
AzureServiceTokenProvider
キャッシュを処理します。
EF Core にはこれを処理するより良い方法がありますか?
.NET CoreのSqlClientのAAD認証メソッドが文書化されていますここ。