加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 如何从单独的.NET应用程序获取当前上下文或用户标识

发布时间:2020-12-16 07:00:29 所属栏目:asp.Net 来源:网络整理
导读:背景 我正在开发从遗留的ASP.NET表单应用程序到MVC 4应用程序的迭代迁移. 此迁移分阶段进行,一次一个部分,因此有必要同时运行旧版和新版MVC应用程序.对于某些部分,用户将被定向到新应用程序,对于尚未迁移的部分,用户将被定向回(或保留在)旧应用程序上. 在服
背景

我正在开发从遗留的ASP.NET表单应用程序到MVC 4应用程序的迭代迁移.

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

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

LEGACY (.NET 2.0 forms app)--
                            |--Api (new MVC 4 WebAPI)
                            |--V2 (new MVC 4)

因此,对遗留的foo页面的调用是/foo.aspx,而在V2它是/ V2 / foo.

一切都在C#中,但请注意遗留应用程序在.NET 2.0上运行,V2应用程序在.NET 4.5上运行.我不确定这是否重要,但认为重要的是要注意.

问题

我无法在应用程序之间成功共享用户/身份验证状态.显然,如果用户登录遗留应用程序,我需要在调用V2页面时在V2应用程序上获取其auth cookie(或采取类似操作),以便再次提示用户无法登录.

我试过了什么

我在两个web.config文件中都设置了相同的authentication和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应用程序的Global.asax中尝试了这段代码:

protected void Application_AuthenticateRequest(Object sender,EventArgs e)
{
    string cookieName = FormsAuthentication.FormsCookieName;
    HttpCookie authCookie = Context.Request.Cookies[cookieName];

    if (authCookie == null)
    {
        return;
    }
    FormsAuthenticationTicket authTicket = null;
    try
    {
        authTicket = FormsAuthentication.Decrypt(authCookie.Value);
    }
    catch
    {
        return;
    }
    if (authTicket == null)
    {
        return;
    }
    string[] roles = authTicket.UserData.Split(new char[] { '|' });
    var id = new FormsIdentity(authTicket);
    var principal = new GenericPrincipal(id,roles);

    //Thread.CurrentPrincipal = principal;

    Context.User = principal;
}

但我不知道它是否有效,因为遗留应用程序与我的V2应用程序不在同一个解决方案中,因此当我调试V2应用程序时,我没有办法通过Legacy应用程序登录并模拟在legacy和V2之间跳跃的实际用户体验.

我也尝试将它添加到我的HomeController中,希望相同的机器键对我有用:

ViewBag.UserName = User.Identity.Name;

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

解决方法

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

.net 4.5无法从4.0(或更低版本)读取auth令牌

http://technet.microsoft.com/en-us/subscriptions/index/system.web.configuration.machinekeycompatibilitymode

http://blogs.msdn.com/b/webdev/archive/2012/10/23/cryptographic-improvements-in-asp-net-4-5-pt-2.aspx

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读