2

我们有 2 个理论上相同的 Web 服务器,但在执行 AzMan 授权检查时会产生不同的结果。

我们在两台机器上运行相同的网站(实际上是相同的网站 - 它已从一台机器复制到另一台机器,并且在同一服务帐户下运行)。该网站所做的只是针对 AzMan 数据库(位于单独的 SQL 服务器上)执行授权检查。

但是,在工作网站 (WebA) 上,此检查返回0(即“用户已授权”),而在损坏的网站 (WebB) 上,此检查返回5(即“用户未授权”)。我们期待0在这两个网站上。同一用户从同一台 PC 访问两个网站。

有人对我们可以检查的事情有任何想法吗?

环境细节

  • 视窗服务器 2008 R2
  • 同一个 AD 域
  • IIS 7.5
  • .NET 3.5
  • AzMan 数据库在 SQL Server 2005/Windows Server 2008 R2 上运行。

代码

AzAuthorizationStoreClass authStore = new AzAuthorizationStoreClass();

// initialise the store
authStore.Initialize(0, "mssql://Driver={SQL Server};Server={OURDBSERVER};Trusted_Connection={Yes};/OURDATABASE/OURAPPLICATION", null);

// open the store
IAzApplication2 authApp = authStore.OpenApplication2("OURAPPLICATION", null);

// get the identity of the user NOT the service account
WindowsIdentity identity = Thread.CurrentPrincipal.Identity as WindowsIdentity;

// and from that derive the token
ulong userToken = (ulong)identity.Token.ToInt64();

// get the context based on the token
IAzClientContext3 clientContext = 
    (IAzClientContext3)authApp.InitializeClientContextFromToken(userToken, null);

// get the operation object based on the id
IAzOperation2 azManOperation = (IAzOperation2)authApp.OpenOperation(operationId, null);

// generate an audit identifier
string auditIdentifer = 
    string.Format("{0}{1} : O:{2}", "{the_correct_id}", identity.Name, operationId);

uint accessResult = clientContext.AccessCheck2(auditIdentifer, string.Empty, azManOperation.OperationID);

return accessResult.ToString();

非常感谢,

RB。

4

2 回答 2

2

感谢 David Hall 为我指明了正确的方向。

调查显示,这两个网站都启用了 Windows 身份验证和匿名访问。然而,在一个网站上,用户正确登录,而在损坏的网站上,它又回到了匿名模式。

禁用匿名访问通过确保用户登录到两个网站来解决此问题。

但是,这留下了另一个问题,即为什么浏览器匿名登录一个网站而不是另一个网站 - 我认为是 ServerFault 的一个。

于 2011-05-05T09:20:14.397 回答
0

在我们的例子中,我们使用带有 Windows 身份验证的 ASP.NET 模拟,而不是匿名。Tt 在 Windows 7 Enterprise x64 开发机器上工作,而不是在 Windows Server 2008 R2 x64 测试服务器上工作。两个应用程序池的设置完全相同,具有相同的域帐户凭据。

事实证明,ASP.NET 模拟是问题的根本原因。禁用 ASP.NET 模拟后,应用程序池帐户现在被用作成功连接到 AzMan 商店的凭据。连接到 Active Directory 或 SQL Server 中的 AzMan 存储时,也会出现同样的问题。

为了清楚起见,我得到的错误是:Value does not fall within the expected range. from AzAuthorizationStoreClass.Initialize()

我的最终连接字符串是:

<add name="AzPolicyStore" connectionString="mssql://Driver={SQL
  Server};Server=sqlserver\instance;/DatabaseName/AzStore" />
于 2013-04-02T22:51:44.527 回答