来自其他网站

时间:2017-04-18 14:02:22

标签: c# .net asp.net-web-api web-config asp.net-web-api-helppages

SCENARIO

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

主体("A")是使用C#中的Web API 2创建的REST服务,它包含一个带有自动生成的帮助页("B")的Regions文件夹。 "A"使用标头授权,而不是表单身份验证。此时"B"没有任何安全性。

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

目标

主要想法是登录"C",点击提供的链接并访问"B"。这里的问题是:如果您尝试直接输入"B"的网址而不登录"C",则会重定向到"C"

实际情况

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

public ActionResult Index()
{

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

首先,这适用于localhost,因为我的PC中是同一个站点。所以我部署在DEV,但当然,它没有用。

所以我使用这些链接:

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

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

.NET Fiddler: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始终为假

我想我错过了或混在一起。我此时迷路了。当我将配置放在“A”Web配置中时,所有内容都会爆炸,因为我在REST服务中没有身份验证表单。

任何提示,评论,答案或问题都会得到预防,同时我仍然会与此作斗争。提前谢谢!

更新1

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

FormsAuthentication.CookiesSupported == true

但是

Request.Cookies[FormsAuthentication.FormsCookieName] == null

1 个答案:

答案 0 :(得分:0)

配置必须在web api的web配置上完成,而不是在帮助区域的配置中完成。