SqlAuthenticationProvider 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
인증 공급자의 핵심 동작을 정의하고 파생 클래스의 기본 클래스를 제공합니다.
public ref class SqlAuthenticationProvider abstract
public abstract class SqlAuthenticationProvider
type SqlAuthenticationProvider = class
Public MustInherit Class SqlAuthenticationProvider
- 상속
-
SqlAuthenticationProvider
- 파생
예제
다음 예제에서는 사용자 지정 SqlAuthenticationProvider를 구현하고 디바이스 코드 흐름 인증 모드를 재정의하기 위해 SqlClient에 동일한 기능을 제공하는 방법을 보여 줍니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Data.SqlClient;
using Microsoft.Identity.Client;
namespace CustomAuthenticationProviderExamples
{
/// <summary>
/// Example demonstrating creating a custom device code flow authentication provider and attaching it to the driver.
/// This is helpful for applications that wish to override the Callback for the Device Code Result implemented by the SqlClient driver.
/// </summary>
public class CustomDeviceCodeFlowAzureAuthenticationProvider : SqlAuthenticationProvider
{
private const string ClientId = "my-client-id";
private const string ClientName = "My Application Name";
private const string DefaultScopeSuffix = "/.default";
// Maintain a copy of the PublicClientApplication object to cache the underlying access tokens it provides
private static IPublicClientApplication pcApplication;
public override async Task<SqlAuthenticationToken> AcquireTokenAsync(SqlAuthenticationParameters parameters)
{
string[] scopes = [ parameters.Resource.EndsWith(DefaultScopeSuffix) ? parameters.Resource : parameters.Resource + DefaultScopeSuffix ];
IPublicClientApplication app = pcApplication;
if (app == null)
{
pcApplication = app = PublicClientApplicationBuilder.Create(ClientId)
.WithAuthority(parameters.Authority)
.WithClientName(ClientName)
.WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
.Build();
}
AuthenticationResult result;
using CancellationTokenSource connectionTimeoutCancellation = new CancellationTokenSource(TimeSpan.FromSeconds(parameters.ConnectionTimeout));
try
{
IEnumerable<IAccount> accounts = await app.GetAccountsAsync();
result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
.ExecuteAsync(connectionTimeoutCancellation.Token);
}
catch (MsalUiRequiredException)
{
result = await app.AcquireTokenWithDeviceCode(scopes, deviceCodeResult => CustomDeviceFlowCallback(deviceCodeResult))
.ExecuteAsync(connectionTimeoutCancellation.Token);
}
return new SqlAuthenticationToken(result.AccessToken, result.ExpiresOn);
}
public override bool IsSupported(SqlAuthenticationMethod authenticationMethod)
=> authenticationMethod.Equals(SqlAuthenticationMethod.ActiveDirectoryDeviceCodeFlow);
private static Task CustomDeviceFlowCallback(DeviceCodeResult result)
{
Console.WriteLine(result.Message);
return Task.CompletedTask;
}
}
public class Program
{
public static void Main()
{
// Register our custom authentication provider class to override Active Directory Device Code Flow
SqlAuthenticationProvider.SetProvider(SqlAuthenticationMethod.ActiveDirectoryDeviceCodeFlow, new CustomDeviceCodeFlowAzureAuthenticationProvider());
using (SqlConnection sqlConnection = new SqlConnection("Server=<myserver>.database.windows.net;Authentication=Active Directory Device Code Flow;Database=<db>;"))
{
sqlConnection.Open();
Console.WriteLine("Connected successfully!");
}
}
}
}
설명
파생 클래스는 app.config 파일에서 인스턴스화할 수 있는 경우 매개 변수가 없는 생성자를 제공해야 합니다.
생성자
SqlAuthenticationProvider() |
인증 공급자의 핵심 동작을 정의하고 파생 클래스의 기본 클래스를 제공합니다. |
메서드
AcquireTokenAsync(SqlAuthenticationParameters) |
기관에서 보안 토큰을 획득합니다. |
BeforeLoad(SqlAuthenticationMethod) |
이 메서드는 공급자가 SQL 드라이버의 레지스트리에 추가되기 직전에 호출됩니다. |
BeforeUnload(SqlAuthenticationMethod) |
이 메서드는 공급자가 SQL 드라이버의 레지스트리에서 제거되기 직전에 호출됩니다. |
GetProvider(SqlAuthenticationMethod) |
메서드별 인증 공급자를 가져옵니다. |
IsSupported(SqlAuthenticationMethod) |
지정된 인증 방법이 지원되는지 여부를 나타냅니다. |
SetProvider(SqlAuthenticationMethod, SqlAuthenticationProvider) |
메서드별 인증 공급자를 설정합니다. |