SSO FormsAuthentication - 2个应用程序 - 1个WebForms和1个MVC

时间:2017-06-27 13:47:36

标签: asp.net asp.net-mvc webforms forms-authentication

我已经阅读了很多帖子,虽然我收集了所有需要的信息但是我无法使用它。所以我希望有人可以指出我正确的方向。或者如果你有一个更好的工作虚拟项目。我看到的所有例子都没有具体处理我的要求2.

我有一个使用FormsAuthentication的现有WebForms(W1)应用程序。作为将其迁移到MVC的一部分,我们希望创建一个MVC(M1)应用程序"以及#34;它并在那里实现新的功能。 (目前,将整个W1应用程序移植到MVC的范围已超出范围。)现有的FormsAuthentication将被维护并用于两个站点。

两个应用程序都将在同一个IIS上运行,但在不同的子域下运行:

  • w1.mydomain.com
  • m1.mydomain.com

期望

  1. 用户将登录W1,经过身份验证后访问M1网址以及W1网址
  2. M1应用程序需要"知道"哪个用户已登录
  3. 通过W1或M1注销将用户注销其他应用程序
  4. 已实施解决方案

    登录:

    • 在域级别分享身份验证Cookie即mydomain.com
    • 成功登录W1后重定向到M1以设置用户身份验证cookie
    • 从M1重定向到W1

    注销:

    • W1 / M1 Call FormsAuthentication.SignOut();然后重定向到另一边做同样的

    配置

      

    W1

    的web.config

    <machineKey decryption="AES" validation="HMACSHA256" decryptionKey="AutoGenerate" validationKey="AutoGenerate" />
    <authentication mode="Forms">
      <forms loginUrl="~/account/login" timeout="120" defaultUrl="~/" domain=".mydomain.com" />
    </authentication>
    <compilation targetFramework="4.6.1"></compilation>
    <!-- requestValidationMode needs to remain -->
    <httpRuntime targetFramework="4.6.1" requestValidationMode="2.0" 
                 maxRequestLength="20480" executionTimeout="300" />
    

    登录控制/ account / login

    <asp:Login ID="idLogin" runat="server" ViewStateMode="Disabled"  DestinationPageUrl="~/sso/BounceLogin.aspx" >
    

    BounceLogin.aspx背后的代码:

    public partial class BounceLogin : Page
    {
        protected void Page_Load(object aSender, EventArgs aArgs)
        {
            Response.Redirect("https://m1.mydomain.com/sso/login");
        }
    }
    
      

    M1

    的web.config

    <machineKey decryption="AES" validation="HMACSHA256" decryptionKey="AutoGenerate" validationKey="AutoGenerate" />
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1" />
    <authentication mode="Forms">
      <forms loginUrl="https://w1.mydomain.com/account/login" timeout="120" domain=".mydomain.com" />
    </authentication>
    

    SSO控制器:

    public class SsoController : Controller
    {
        [Authorize]
        // GET: Secure
        public ActionResult Index()
        {
            return View();
        }
    
        public ActionResult Status()
        {
                return View(new ViewModel
                {
                    TheUser = User
                });
        }
    
        public ActionResult Logout()
        {
            FormsAuthentication.SignOut();
            return Redirect("https://w1.mydomain.com/");
        }
    
        public ActionResult Login()
        {
            FormsAuthentication.SetAuthCookie("test@mydomain.com", false);
            return Redirect("https://w1.mydomain.com/sso/BounceLoginReturn");
        }
    }
    

    相互作用

    因此,当我使用我的测试用户登录时会发生什么:test@mydomain.com。 (我已经省略了传递给M1的用户名来保持代码更简单。)

      

    一个。 w1.mydomain.com/account/login - 执行成功登录并重定向到m1.mydomain.com/sso/login

         

    B中。 m1.mydomain.com/sso/login - 为用户test@mydomain.com设置cookie并重定向到w1.mydomain.com/BounceLoginReturn

    问题

    当我返回w1.mydomain.com/BounceLoginReturn时,W1仍然认为我没有登录并将我重定向到w1.mydomain.com/account/login。 (如果我在另一个浏览器选项卡中打开M1,它会告诉我我以user@test.com身份登录)

    我已经检查过,并且w1.mydomain.com和m1.mydomain.com都为域.mydomain.com设置了相同的Cookie值。

    所以我在这里做错了让W1认为我没有登录记住我最初通过asp登录:它包含的登录控件?

1 个答案:

答案 0 :(得分:0)

如果其他人有这个问题,事实证明解决方案很简单。我上面的代码在功能上是正确的。但我确实需要使用硬编码密钥:

<machineKey decryption="AES" validation="HMACSHA256" decryptionKey="{Hard Coded Key Here}" validationKey="{Hard Coded Key Here}" />

有大量网站可以生成这些网站,但最简单的方法是使用IIS本身:

enter image description here

然后使用&#34;生成密钥&#34;在右边。