内容简介:我遇到的情境是這樣的:某歷史悠久的網站由新舊程式組成,早期開發是用 WebForm,後期擴充功能時另開了 MVC 專案,所以站台上有兩個 Web Application,一個是 Web Site,一個是 MVC。 架構潔癖者看到這裡可能就怒了,把系統搞成這樣是要怎麼維護? 是不會繼續用 WebForm 寫或乾脆全翻成 MVC 嗎? 唉,繼續用 WebForm 寫新功能會傷心,用 MVC 全部翻新系統會傷肝,還可能危害心血管跟飯碗(想想最近新聞上花一百億砍掉重練的故事...),當痛苦指數仍在可承受範圍內,海納
我遇到的情境是這樣的:某歷史悠久的網站由新舊程式組成,早期開發是用 WebForm,後期擴充功能時另開了 MVC 專案,所以站台上有兩個 Web Application,一個是 Web Site,一個是 MVC。 架構潔癖者看到這裡可能就怒了,把系統搞成這樣是要怎麼維護? 是不會繼續用 WebForm 寫或乾脆全翻成 MVC 嗎? 唉,繼續用 WebForm 寫新功能會傷心,用 MVC 全部翻新系統會傷肝,還可能危害心血管跟飯碗(想想最近新聞上花一百億砍掉重練的故事...),當痛苦指數仍在可承受範圍內,海納百川是上策呀~
近期接到需求,系統要從 Windows 整合式驗證改為 Form 驗證,憑著第一時間直覺,我捲起袖子自幹了一套簡易版 Single Sign On 身分同步機制,搞到滿頭大汗,但也成功讓 MVC 用 WebForm 的 Form 驗證登入身分。
早上跑步,跑著跑著忽然想到一件事:同一個站台多個 Web Application 的 Cookie 原本就可共享, 而 Form 驗證靠的是 .ASPXAUTH Cookie 配合 Machine Key 加密。因此只要確保 WebForm 與 MVC 的 Form 驗證 Cookie 能互通,就可以做到 Web Form 登入寫入 .ASPXAUTH Cookie, 連上 MVC 時,MVC 解密 .ASPXAUTH Cookie 取出登入身分,即可實現 Web Form 與 MVC 共用登入,根本不需要自己搞 SSO。
跑完步迫不及查資料加寫測試程式,嘿嘿嘿,還真的讓我做出來了!
先整理一些背景知識:
測試環境如下,IIS 站台有兩個網站專案,FormAuthWebForm 及 FormAuthMvc 分別為 Web Site Project 及 ASP.NET MVC。我將登入頁面放在 WebForm Login.aspx:
Login.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<h3>WebForm</h3>
<form id="form1" runat="server">
<div>
Account:
<asp:TextBox runat="server" id="txtUserId" text="Jeffrey"></asp:TextBox>
</div>
<div>
Password:
<asp:TextBox runat="server" ID="txtPasswd" TextMode="Password"></asp:TextBox>
</div>
<asp:Button runat="server" id="btnLogin" OnClick="btnLogin_OnClick" text="Login"/>
</form>
</body>
</html>
Login.aspx.cs
using System;
using System.Web.Security;
public partial class Login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnLogin_OnClick(object sender, EventArgs e)
{
var userId = txtUserId.Text;
var passwd = txtPasswd.Text;
//展示用途,省略密碼驗證,直接登入
FormsAuthentication.RedirectFromLoginPage(userId, false);
}
}
AutoFormWebForm/web.config 要設成 Form 驗證。但有幾個注意事項:
- MVC 的 httpRuntime 使用 4.5.2,實測 WebForm 也要配合設成
<httpRuntime targetFramework="4.5.2" />才會通。 參考 - MVC 與 WebForm 必須使用相同 Machine Key,.ASPXAUTH Cookie 才能同時被兩邊解密驗證,故 Machine Key 不能自動產生,要在 web.config 加上
<machineKey ...>指定。IIS 管理員有產生 Machine Key 的工具。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<compilation debug="false" targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" />
<authentication mode="Forms">
<forms loginUrl="Login.aspx" />
</authentication>
<machineKey decryption="AES" decryptionKey="4134...省略..." validation="SHA1" validationKey="D1DD...省略..." />
<authorization>
<deny users="?" />
</authorization>
<pages controlRenderingCompatibilityVersion="4.0" />
</system.web>
</configuration>
MVC 端也要修改 web.config。首先 machineKey 要跟 WebForm 網站一致,forms loginUrl 指向 /FormAuthWebForm/Login.aspx,defaultUrl 則指向自己的 Home/Index。
<system.web>
<compilation debug="true" targetFramework="4.5.2"/>
<httpRuntime targetFramework="4.5.2"/>
<authentication mode="Forms">
<forms loginUrl="/FormAuthWebForm/Login.aspx" defaultUrl="~/Home/Index"></forms>
</authentication>
<<machineKey decryption="AES" decryptionKey="4134...省略..." validation="SHA1" validationKey="D1DD...省略..." />
<authorization>
<deny users="?"/>
</authorization>
</system.web>
在 Index.cshtml 加入一段程式驗證 MVC 端是否能抓到 WebForm 登入使用者名稱:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
<h3>MVC</h3>
Login User = @User.Identity.Name
</div>
</body>
</html>
實測結果:
掌握這個原則,意味著只要我們能確保 Cookie 可被讀取外加 Machine Key 一致,就能在多個 ASP.NET Web Application 間(不管是 MVC 還是 WebForm,即使在不同站台也可能,只要 Cookie 能互通)共享 Form 驗證登入身分。酷~
Tutorial of how to setup to make ASP.NET WebFrom web site and MVC.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
html转js在线工具
html转js在线工具
RGB CMYK 转换工具
RGB CMYK 互转工具