0

设想

我在 IIS 中有一个带有两个应用程序的站点。

主体("A")是使用 C# 中的 Web API 2 制作的 REST 服务,它包含在带有自动生成的 Help Page 的 Areas 文件夹内("B")
"A"使用标头授权,而不是表单身份验证。此刻"B"没有任何安全感。

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

目标

主要思想是登录"C",单击提供的链接并访问"B"。这里的事情是这样的:如果您尝试直接在"B"不登录的 URL 上输入"C",您会重定向到"C"

实际情况

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

public ActionResult Index()
{

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

起初,这适用于本地主机,因为它是我 PC 中的同一个站点。所以我在 DEV 进行了部署,但当然,它没有用。

所以我正在使用这些链接:

跨应用程序的表单身份验证
如何:在 ASP.NET 2.0
machineKey 元素(ASP.NET 设置架构)中配置 MachineKey
MachineKeySection.CompatibilityMode 属性

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

.NET Fiddler:生成加密的 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" 
 />

但是,在"C"位于 Areas\HelpPage\Views 的 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总是错误的

我想我错过或混合了一些东西。我在这一点上迷路了。当我将配置放入“A”Web 配置时,一切都以 500 爆炸,因为我在 REST 服务中没有身份验证表单。

任何提示,评论,答案或问题都将受到重视,同时我仍然为此而战。提前致谢!


更新 1

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

FormsAuthentication.CookiesSupported == true

Request.Cookies[FormsAuthentication.FormsCookieName] == null
4

1 回答 1

0

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

于 2017-04-18T19:53:40.543 回答