Web API 具有来自其他站点的交叉身份验证身份的帮助页面

Web API Help page with cross authentication identity from other site

场景

我在 IIS 中有一个站点,其中包含两个应用程序。

主体 ("A") 是使用 C# 中的 Web API 2 制作的 REST 服务,它包含在一个区域文件夹中,带有自动生成的帮助页面 ("B")
"A" 使用 header 授权,不使用表单身份验证。目前"B"没有任何安全保障。

第二个应用程序是 C# MVC 站点 ("C"),带有身份验证表单和登录名。它有一个 link 到文档 ("B")

目标

主要想法是登录 "C",单击提供的 link 并访问 "B"。这里的事情是这样的:如果你试图直接进入 "B" 的 URL 而没有登录 "C",你会被重定向到 "C"

实际情况

所以我所做的,首先是在 "B",文件 HelpController.cs:

public ActionResult Index()
{

    if (System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
    {
       *** do things

起初,这适用于 localhost,因为它与我的 PC 中的站点相同。所以我在 DEV 部署了,当然,它没有用。

所以我使用这些 links:

Forms Authentication Across Applications
How To: Configure MachineKey in ASP.NET 2.0
machineKey Element (ASP.NET Settings Schema)
MachineKeySection.CompatibilityMode Property

经过大量工作和加密错误后,它只能使用 32 长度的密钥。其他配置不起作用。生成此密钥的代码是:

.NET 提琴手:Generate Encrypted MachineKey

int len = 64;
byte[] buff = new byte[len/2];
RNGCryptoServiceProvider rng = new 
RNGCryptoServiceProvider();
rng.GetBytes(buff);
StringBuilder sb = new StringBuilder(len);
for (int i=0; i<buff.Length; i++)
  sb.Append(string.Format("{0:X2}", buff[i]));
Console.WriteLine(sb);

所以我把这个配置放在 "C" 上,它起作用了!

    <authentication mode="Forms">
  <forms loginUrl="~/Account/Logon" cookieless="UseCookies" slidingExpiration="true" timeout="480" 
  name="ASPXFORMSAUTH" 
    protection="All"  
    path="/" 
  />
</authentication>


 <machineKey
  validationKey="5FEA041C5EE0836460BC2C3D8636F2610A357D9B7D606591112089CDEBDA871D" 
  decryptionKey="C8E79DC95283007C6E3D6E6698130501680CE032C28DDE4DDB678BAB683C2AFA" 
 />

但是,在位于 Areas\HelpPage\Views 的 "C" web.config 中,此代码:

    <authentication mode="Forms">
  <forms cookieless="UseCookies" slidingExpiration="true" timeout="480" 
  name="ASPXFORMSAUTH" 
    protection="All"  
    path="/" 
  />

     <machineKey
  validationKey="5FEA041C5EE0836460BC2C3D8636F2610A357D9B7D606591112089CDEBDA871D" 
  decryptionKey="C8E79DC95283007C6E3D6E6698130501680CE032C28DDE4DDB678BAB683C2AFA" 
 />

但没有用。我的意思是,"A" 和 "B" 网站有效,但 System.Web.HttpContext.Current.User.Identity.IsAuthenticated 始终为 false

我想我缺少或混合了一些东西。我现在迷路了。当我将配置放入 "A" 网络配置时,所有内容都以 500 爆炸,因为我在 REST 服务中没有身份验证表单。

任何提示、评论、答案或问题都将得到预估,同时我仍然为此而斗争。提前致谢!


更新 1

调试代码,我得到这些值:

FormsAuthentication.CookiesSupported == true

但是

Request.Cookies[FormsAuthentication.FormsCookieName] == null

配置必须在webapi的web config上进行,而不是帮助区的config