是否可以在 Azure SQL 数据库中按用户实施行级安全性并在 ASP.Net 3.1 Web 应用程序上访问用户特定的行集

Is it possible to implement Row Level Security by User in Azure SQL DB and Access the User Specific Rowset on ASP.Net 3.1 Web App

我有一个 Azure SQL 数据库和一组需要 remote/mobile 访问此数据库中数据的用户。我想实施行级安全性 return 每个用户的过滤子集。

我可以处理的行级安全性,但我一直在尝试弄清楚 ASP.Net Core 3.1 Web 应用程序是否可以将用户身份验证转发到 Azure SQL DB 或仅对 Web 应用程序进行身份验证Azure SQL DB.

我发现的唯一信息是使用托管身份进行连接,它授予应用程序访问数据库的权限并有效地绕过用户的凭据。

这真的可以实现吗?如何使用 AzureAD 身份验证通过 Web 应用程序将用户登录到数据库?

通过我的 DbContext,这适用于应用程序身份验证

var conn = (Microsoft.Data.SqlClient.SqlConnection)Database.GetDbConnection();
conn.AccessToken = 
          (new Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider())
          .GetAccessTokenAsync("https://database.windows.net/")
          .Result;

但是如果我尝试使用 AzureAD 身份验证,我会收到错误消息:SqlException: Login failed for user

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
         .AddAzureAD(options => config.Bind("AzureAd", options));

据mu了解,您想使用Azure AD用户登录AzureSQL。如果是,请参考以下步骤

  1. Add Azure AD user as database user

  2. 创建 Azure AD 应用程序

  3. 配置权限

  4. 配置 Azure AD 身份验证

 services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
                  .AddAzureAD(options => Configuration.Bind("AzureAd", options));
            services.Configure<AzureADOptions>(options => Configuration.Bind("AzureAd", options));
            services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
            {

                options.Authority = options.Authority + "/v2.0/";
                options.Scope.Add("https://database.windows.net//.default"); // get token fro azure sql
                options.ResponseType = OpenIdConnectResponseType.CodeIdToken;

                options.Events.OnAuthorizationCodeReceived = async context =>
                {
                    var request = context.HttpContext.Request;
                    string currentUri = UriHelper.BuildAbsolute(
                       request.Scheme,
                       request.Host,
                       request.PathBase,
                       options.CallbackPath);

                    var code = context.ProtocolMessage.Code;
                    string signedInUserID = context.Principal.FindFirst(ClaimTypes.NameIdentifier).Value;
                    IConfidentialClientApplication cca = ConfidentialClientApplicationBuilder
                              .Create(options.ClientId)
                              .WithClientSecret(options.ClientSecret)
                              .WithRedirectUri(currentUri)
                              .WithAuthority(options.Authority)
                              .Build();

                    AuthenticationResult result = await cca.AcquireTokenByAuthorizationCode(options.Scope, code)
                        .ExecuteAsync();

                    context.HandleCodeRedemption(result.AccessToken, result.IdToken);

                };

            });
  1. 需要访问令牌
 IConfidentialClientApplication cca = ConfidentialClientApplicationBuilder
                              .Create(ClientId)
                              .WithClientSecret(ClientSecret)
                              .WithRedirectUri(currentUri)
                              .WithAuthority(Authority)
                              .Build();
 var accounts = await cca.GetAccountsAsync();
                AuthenticationResult result = await cca.AcquireTokenSilent(scope, accounts.FirstOrDefault())
                    .ExecuteAsync();
var conn = (Microsoft.Data.SqlClient.SqlConnection)new SqlConnection(ContionStr);
conn.AccessToken = result.AccessToken

更多关于Azure AD auth的实现方法,请参考document