当前位置: 首页 > 知识库问答 >
问题:

从Azure应用程序服务连接到Azure SQL数据库

李云
2023-03-14

我已使用WebForms从VS-2019成功发布Azure应用服务。我已成功保护它,以便用户必须使用与应用服务相同域中的Azure AAD帐户登录。我已成功创建AzureSQL数据库。我已成功将AAD域中的用户添加到数据库中,并通过将我创建的Azure AAD帐户用户之一硬编码到连接字符串中,从Azure应用服务中连接到数据库

现在,我想使用应用程序服务登录名中经过身份验证的AAD用户连接到Azure SQL数据库。到目前为止,我所尝试的一切都失败了。

我对Azure相当陌生。我的大部分经验是在内部公司域上使用SQL服务器/Visual Studio,没有任何云服务。

有人有什么建议吗?

这是我的身份验证码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using System.Security.Claims;
using System.Threading.Tasks;

using Microsoft.Owin.Extensions;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security.OpenIdConnect;
using Owin;

using System.Net.Http;

namespace Church
{

    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
        }
        private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
        private static string aadInstance = EnsureTrailingSlash(ConfigurationManager.AppSettings["ida:AADInstance"]);
        private static string tenantId = ConfigurationManager.AppSettings["ida:TenantId"];
        private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"];

        string authority = aadInstance + tenantId;

        public void ConfigureAuth(IAppBuilder app)
        {
            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

            app.UseCookieAuthentication(new CookieAuthenticationOptions());

            app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = authority,
                PostLogoutRedirectUri = postLogoutRedirectUri,

                Notifications = new OpenIdConnectAuthenticationNotifications()
                {
                    AuthenticationFailed = (context) =>
                    {
                        return System.Threading.Tasks.Task.FromResult(0);
                    },
                    SecurityTokenValidated = (context) =>
                    {
                        var claims = context.AuthenticationTicket.Identity.Claims;
                        var groups = from c in claims
                                     where c.Type == "groups"
                                     select c;

                        foreach (var group in groups)
                        {
                            context.AuthenticationTicket.Identity.AddClaim(new Claim(ClaimTypes.Role, group.Value));
                        }
                        return Task.FromResult(0);
                    }
                }

            }
            );
            // This makes any middleware defined above this line run before the Authorization rule is applied in web.config
            app.UseStageMarker(PipelineStage.Authenticate);
        }


        private static string EnsureTrailingSlash(string value)
        {
            if (value == null)
            {
                value = string.Empty;
            }

            if (!value.EndsWith("/", StringComparison.Ordinal))
            {
                return value + "/";
            }

            return value;
        }

    }


}
enter code here

共有1个答案

郤飞英
2023-03-14

此任务a有点复杂。为了实现您的愿望,您必须配置EasyAuth(应用服务身份验证/授权服务)以同时获取AzureSQLDB的访问令牌。您可以在此处阅读有关使用Azure应用服务身份验证的访问令牌的更多信息。请注意Azure Active Directory配置部分。您将被指示转到https://resources.azure.com/,找到您的应用服务并更新以下属性:

"addtionalLoginParams":["response_type=代码id_token","资源="]

对于资源参数,您应该使用https://database.windows.net/,它是AzureSQLDB的标识符。这将允许应用服务身份验证服务(EasyAuth)代表AzureSQLDB的用户获取访问令牌。然后,您将能够从HTTP HEADERX-MS-TOKEN-AAD-ACCESS-TOKEN(也在同一留档页面上进行了描述)获取此访问令牌。

一旦您成功获取Azure SQL DB的访问令牌,那么您应该对Azure SQL DB使用令牌身份验证,而不是基于用户/密码。文档中的令牌身份验证部分在这里隐藏得很好,本例对此进行了演示:

string ConnectionString =@"Data Source=n9lxnyuzhv.database.windows.net; Initial Catalog=testdb;"
SqlConnection conn = new SqlConnection(ConnectionString);
conn.AccessToken = "Your JWT token that you took from HTTP HEADER X-MS-TOKEN-AAD-ACESS-TOKEN"
conn.Open();
 类似资料:
  • 我们有一个ASP经典Web应用程序在Azure应用服务中成功运行,该应用程序当前使用SQL服务器身份验证来访问AzureSQL数据库。我们需要将身份验证更改为Active Directory用户。我们设法使此应用程序从访问AzureSQL数据库的开发人员工作站工作,请参阅下面的工作和不工作。 *不适用于桌面,也不适用于Azure Conportail。打开"提供商=SQLOLEDB;服务器=tcp

  • 我有一个Azure云服务(辅助角色),它需要连接到我的AzureSQL数据库,还需要连接到外部数据库。 在开发过程中,外部数据库位于公共互联网上,连接不是问题。 但是,现在需要在生产环境中部署该解决方案,并且通过设置虚拟网络来限制对外部数据库的访问。 部署在虚拟网络中时,云服务会从子网获取IP,但外部世界似乎无法访问,并且不会连接到AzureSQL数据库(我也无法对其进行RDP)。 这似乎超出了我

  • 我在PHP8中有Azure web应用程序,希望从php代码连接到Oracle数据库12C。从文档中,我发现下面的博客说我们需要Oracle Instant Client,但我没有找到安装步骤。在这个博客中,他们提到php版本高达5.6,但我使用的是PHP8版本。 https://docs.microsoft.com/en-us/archive/blogs/azureossds/access-or

  • 已将本地Web应用程序(. net 4.6.1)迁移到Azure,该应用程序对其用户使用Windows身份验证,然后使用AD集成身份验证连接到MSSQL数据库。 理想情况下,应该保留现有的安全机制,即向AD用户授予对数据库对象的权限,并让DB成为应用程序的安全源。 已创建并配置SQL数据库的副本。 如果我在本地运行web应用程序,但使用新的Azure数据库,则一切正常。 如果我运行此命令,我将获得

  • 问题内容: 我正在研究将由学校使用的应用程序。每所学校将建立自己的数据库。每个学校都会为应用程序提供自己的“设置”文件。设置文件将包含创建设置文件的特定学校的数据库URL。这样一来,使用该应用程序的学生如果想连接到其他数据库,就只能加载其他设置文件。 我的问题是,如何保护用于连接数据库的用户名和密码?因此,只有应用程序具有对数据库的读写访问权限。应用程序仅具有该特定学校的读写权限吗? 如果您需要更