Можно ли реализовать безопасность на уровне строк пользователем в Azure SQL БД и получить доступ к пользовательской спецификации c Rowset в ASP. Net 3.1 веб-приложении - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть база данных Azure SQL и группа пользователей, которым необходим удаленный / мобильный доступ к данным в этой базе данных. Я хотел бы реализовать Row Level Security, чтобы возвращать отфильтрованное подмножество каждому пользователю.

Row Level Security, с которым я могу справиться, но я застрял, пытаясь выяснить, является ли ASP. Net Core 3.1 Web App может пересылать аутентификацию пользователя в Azure SQL БД или аутентифицировать веб-приложение только в Azure SQL БД.

Единственная информация, которую я нашел, - это использовать управляемую идентификацию для подключения который предоставляет приложению доступ к БД и эффективно обходит учетные данные пользователя.

На самом ли деле этого можно достичь? Как войти в базу данных через Web-приложение с использованием аутентификации AzureAD?

Через мой 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));

1 Ответ

1 голос
/ 14 апреля 2020

В соответствии с моим пониманием, вы хотите использовать Azure пользователей AD для входа в систему Azure SQL. Если это так, пожалуйста, обратитесь к следующим шагам

  1. Добавить Azure пользователя AD в качестве пользователя базы данных

  2. Создать Azure Приложение AD

  3. Настройка разрешений enter image description here

  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);

                };

            });
требуется токен доступа
 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, см. Документ

...