Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何从单独的.NET应用程序中获取当前上下文或用户标识? 背景_Asp.net_Asp.net Mvc_Forms Authentication_Membership Provider - Fatal编程技术网

Asp.net 如何从单独的.NET应用程序中获取当前上下文或用户标识? 背景

Asp.net 如何从单独的.NET应用程序中获取当前上下文或用户标识? 背景,asp.net,asp.net-mvc,forms-authentication,membership-provider,Asp.net,Asp.net Mvc,Forms Authentication,Membership Provider,我正在开发一个从传统ASP.NET表单应用程序到MVC4应用程序的迭代迁移 这种迁移是分阶段进行的,一次一个部分,因此有必要同时运行旧的和新的MVC应用程序。对于某些部分,用户将被定向到新应用程序,对于尚未迁移的部分,用户将被定向回(或保留在)旧应用程序 在服务器上,应用程序的结构如下: LEGACY (.NET 2.0 forms app)-- |--Api (new MVC 4 WebAPI)

我正在开发一个从传统ASP.NET表单应用程序到MVC4应用程序的迭代迁移

这种迁移是分阶段进行的,一次一个部分,因此有必要同时运行旧的和新的MVC应用程序。对于某些部分,用户将被定向到新应用程序,对于尚未迁移的部分,用户将被定向回(或保留在)旧应用程序

在服务器上,应用程序的结构如下:

LEGACY (.NET 2.0 forms app)--
                            |--Api (new MVC 4 WebAPI)
                            |--V2 (new MVC 4)
因此,对legacy上的
foo
页面的调用是
/foo.aspx
,而在V2上则是
/V2/foo

所有内容都是C#,但请注意,旧版应用程序运行在.NET 2.0上,V2应用程序运行在.NET 4.5上。我不确定这是否重要,但我认为值得注意

问题 我无法在应用程序之间成功共享用户/身份验证状态。显然,如果用户登录了旧版应用程序,我需要在调用V2页面时在V2应用程序上获取他们的身份验证cookie(或采取类似操作),这样用户就不会再次收到登录提示

我试过的 我在这两个web.config文件中设置了相同的
身份验证
machinekey
元素:

  <authentication mode="Forms">
      <forms cookieless="UseCookies" defaultUrl="~/someUrl" loginUrl="/" path="/" protection="All" timeout="240"  enableCrossAppRedirects ="true" domain="someDomain.com" requireSSL="false"  />
  </authentication>
  <machineKey validationKey="DE78CF63226. . .788658D142AB881" decryptionKey="0B97E8BA4C4EB4B4C524. . .54E4622E14168D2D5C84461FA2" validation="SHA1" decryption="AES" />
但我不知道它是否有效,因为旧版应用程序与我的V2应用程序不在同一个解决方案中,因此当我调试V2应用程序时,我无法通过旧版应用程序登录并模拟在旧版和V2之间跳跃的实际用户体验

我还尝试将此添加到我的
HomeController
,希望相同的机器钥匙能为我带来一些魔力:

 ViewBag.UserName = User.Identity.Name;

显然,我随后将
ViewBag.UserName
绑定到视图中的html元素,但这似乎也不起作用。

这两个应用程序使用的域/子域是什么?cookie不会在域之间甚至子域之间共享(除非cookie是在通配符域上设置的,即.*.mydomain.com)

例如,如果V1应用程序位于V1.somedomain.com,而cookie设置在V1.somedomain.com。然后V2,在V2.somedomain.com,将看不到它。但是,如果在*.somedomain.com上设置cookie,则两个应用程序都将看到cookie


但是,如果V1在v1domain.com上,V2在v2domain.com上,那么您就不走运了。无法共享cookie。

表单身份验证的签名和加密算法在.NET 2.0和4.0之间切换;因此,在您的4.0配置中,请尝试

<appSettings>
    <add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" />
    <add key="aspnet:UseLegacyEncryption" value="true" />
    <add key="aspnet:UseLegacyMachineKeyEncryption" value="true" />
</appSettings>

在asp.net上设置machineKey compatibilityMode=“Framework20SP2”在父应用程序上

.net 4.5无法从4.0(或更低版本)读取身份验证令牌


谢谢。实际上,我希望通过将V2应用程序配置为父域的子文件夹而不是子域来避免这种情况。那么,既然它在一个子文件夹中,您上面的逻辑还会适用吗?谢谢只要他们共享cookie设置所在的域,他们都应该能够看到它。谢谢,但即使在将这些元素添加到web.config之后,我仍然无法访问任何用户上下文。你能举个例子说明我如何检索登录用户的用户名吗?我尝试了
User.Identity.Name
,但失败了。我错过什么了吗?谢谢你根本不需要做任何神奇的事情;auth cookie现在应该可以在两个应用程序上运行。通过为forms auth配置V2应用程序,在没有自定义AuthenticateRequest的情况下,它应该可以很好地共享Cookie。因此,现在让我们忽略webapi,集中精力配置v2和v4应用程序以共享。我建议先建立一个框架,表单由hello用户授权。这是一个真正适合我的情况的东西!
<appSettings>
    <add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" />
    <add key="aspnet:UseLegacyEncryption" value="true" />
    <add key="aspnet:UseLegacyMachineKeyEncryption" value="true" />
</appSettings>