asp.net Azure Active Directory密码验证问题

oxalkeyp  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(123)

我们正在尝试从Azure应用服务中托管的.Net Web App使用Azure AD(Active Directory密码身份验证)。但当应用尝试连接到Azure SQL数据库时,我们收到连接错误。
错误代码:
“/”应用程序中的服务器错误。该函数不熟悉生成服务器证书的证书颁发机构。说明:在执行当前Web请求期间发生了未处理的异常。有关此错误及其在代码中起源的详细信息,请查看堆栈跟踪。
异常详细信息:AdalException:函数不熟悉生成服务器证书的证书颁发机构。
错误代码:在执行当前Web请求期间生成了未处理的异常。有关异常的来源和位置的信息可以使用下面的异常堆栈跟踪来标识。堆栈跟踪:[AdalException:该函数不熟悉生成服务器证书的证书颁发机构。]
ADALNativeWrapper. ADALGetToken(String username,IntPtr password,String stsURL,String servicePrincipalName,ValueType correlationId,String clientId,Boolean* fWindowsIntegrated,Int64& fileTime)+867
ADALNativeWrapper. ADALGetToken(String username,String password,String stsURL,String servicePrincipalName,ValueType correlationId,String clientId,Int64& fileTime)+105
System.Data.SqlClient.<>c__DisplayClass2_0.b__0()+371 System.Threading.Tasks.Task 1.InnerInvoke() +58 System.Threading.Tasks.Task.Execute() +48 [AggregateException: One or more errors occurred.] System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) +4316222 System.Threading.Tasks.Task 1.GetResultCore(Boolean waitCompletionNotification)+12771596
System.Threading.Tasks.Task 1.get_Result() +34 System.Data.SqlClient.<>c__DisplayClass134_1.<GetFedAuthToken>b__3() +41 System.Threading.Tasks.Task 1.Innerarche()+58 System.Threading.Tasks.Task.Execute()+48

h5qlskok

h5qlskok1#

我已经尝试用你在下面的实现中给出的相同的技术栈应用程序来重现你的问题:
1.在本地创建了.NET Core 6 Web应用程序,并在Azure门户中创建了Azure App Service + SQL数据库。
要使用.NET Core应用程序实现Azure AD密码身份验证的要求,您必须在两个方面进行一些更改。一个是应用程序代码,另一个是Azure门户端。
我是通过遵循 *TimBurris * 教程和GitHub的代码片段来做到这一点的。

这是我的应用代码文件夹结构

x1c 0d1x的数据

代码文件配置:

Index.cshtml

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div class="text-center">
    <h1 class="display-4">This is a list of Products</h1>    
    <table class="table table-bordered">
  <thead>
    <tr>
      <th scope="col">Product ID</th>
      <th scope="col">Product Name</th>
      <th scope="col">Quantity</th>      
    </tr>
  </thead>
   <tbody>
    
        @foreach(var product in Model.Products)
                {
                    <tr>
                    <th scope="row">@product.ProductID</th>
                    <td>@product.ProductName</td>
                    <td>@product.Quantity</td>
                    </tr>
                }                
    
    </tbody>
  </table>
</div>

字符串

ProductService.cs

using KamNetCoreSqlApp572.Models;
using System.Data.SqlClient;

namespace KamNetCoreSqlApp572.Services
{

    // This service will interact with our Product data in the SQL database
    public class ProductService
    {
        private static string db_source = "<server_name>.database.windows.net";
        private static string db_user = "<user_name>";
        private static string db_password = "<password>";
        private static string db_database = "<db_name>";

        private SqlConnection GetConnection()
        {
            
            var _builder = new SqlConnectionStringBuilder();
            _builder.DataSource = db_source;
            _builder.UserID = db_user;
            _builder.Password = db_password;
            _builder.InitialCatalog = db_database;
            return new SqlConnection(_builder.ConnectionString);
        }
        public List<Product> GetProducts()
        {
            List<Product> _product_lst = new List<Product>();
            string _statement = "SELECT ProductID,ProductName,Quantity from Products";
            SqlConnection _connection = GetConnection();
            
            _connection.Open();
            
            SqlCommand _sqlcommand = new SqlCommand(_statement, _connection);
            
            using (SqlDataReader _reader = _sqlcommand.ExecuteReader())
            {
                while (_reader.Read())
                {
                    Product _product = new Product()
                    {
                        ProductID = _reader.GetInt32(0),
                        ProductName = _reader.GetString(1),
                        Quantity = _reader.GetInt32(2)
                    };

                    _product_lst.Add(_product);
                }
            }
            _connection.Close();
            return _product_lst;
        }

    }
}

appsettings.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "<copy the primary domain of your Azure AD looks like `xxx.onmicrosoft.com`",
    "TenantId": "<Azure_Tenant_Id>",
    "ClientId": "<Azure_App_Registration_ClientId>",
    "CallbackPath": "/signin-oidc"
  }
}

产品.cs

namespace KamNetCoreSqlApp572.Models
{
    public class Product
    {
        public int ProductID { get; set; }
        public string ProductName { get; set; }    
        public int Quantity { get; set; }
    }
}

Azure Portal中的配置:

运行下面的脚本在SQL数据库中创建一些数据:

CREATE TABLE Products
(
     ProductID int,
     ProductName varchar(1000),
     Quantity int
)

INSERT INTO Products(ProductID,ProductName,Quantity) VALUES (1,'Mobile',100)
INSERT INTO Products(ProductID,ProductName,Quantity) VALUES (2,'Laptop',200)
INSERT INTO Products(ProductID,ProductName,Quantity) VALUES (3,'Tabs',300)

  • 在SQL Server的服务器防火墙中添加客户端IP。

1.转到Microsoft Entra ID -应用程序注册-使用端点新建:

  • 您的Azure Web App URL:https://kamnetcoresqlapp572.azurewebsites.net/signin-oidc
  • 如果您在本地运行,请将应用程序URL从Project > Properties Folder > launchSettings.json复制到App Registration Endpoints:



从同一应用程序注册菜单中,转到企业应用程序,您必须在其中添加用户,如下所示:


结果

1.生成解决方案并将其发布到Azure Web App。
1.复制Azure Web App URL并在浏览器中打开它,它将要求您提供用户邮件ID和密码,并授予访问权限,如下面的屏幕截图所示:



1.选中同意框并接受,它将带您进入代码中定义的结果页面。

相关问题