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
场景
我在 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