文章

使用Visual Studio Code 編輯Azure Pipline

圖片
問題
Azure Pipelines 在網頁上編輯,雖然提供了提示、Task UI輸入方式,但編輯時,卻總覺得不是很方便。例如:輸入法不小心切到中文,會有亂碼問題。 由於yaml的語法嚴謹性,換行,縮排、空格要排好,不然會直接報錯。而換行、複製/貼上時,縮排常會跑掉,所以又要一直調整......=.=。
解決方法
使用Visual Studio Code編輯YML,支援排版、語法提示等。
1.安裝extension: Azure Pipeline
2.進入Command Palette,找到Azure Pipeline 組態
 針對*.yml設定為Azure Pipelines
設定完成 編輯時會出現相闗提示
其它/參考 Visual Studio Code 編輯Azure DevOps Pipeline的YAML 這裡有教到如何連接Azure Piple直接建立檔案,但我沒試成功,只有用編輯器提示功能。

Jenkins無法更新版本

圖片
問題
公司有2台CI Server,一台正式區,一台測試區, 從上星期開始,測試區主機一直無法更新,另一台正式區的卻可以。一開始以為是地理環境,連的Jenkins Update Center不同,才會有此情形,所以放先不管它。
這兩天再次執行更新,仍然會出現錯誤,訊息如下,找不到憑證。
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.build(Unknown Source) at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source) at java.security.cert.CertPathBuilder.build(Unknown Source) Caused: sun.security.validator.ValidatorException: PKIX path building failed at sun.security.validator.PKIXValidator.doBuild(Unknown Source) at sun.security.validator.PKIXValidator.engineValidate(Unknown Source) at sun.security.validator.Validator.validate(Unknown Source) at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source) ....

原因
一開始搜尋時,找到解答大部份是使用Keytool import或者修改Update …

使用Azure Pipeline發佈Artifacts

圖片
前言
之前寫過一篇使用Azure DevOps Artifacts來建立自用Nuget Source,發行的方式,在本機使用Power Shell。一開始頻繁修改,對發行方式還很熟,沒什麼問題。 但...隨著時間一久就開始有了以下問題:
太久沒更新程式! 要再發行時,就會頓時卡卡的,需要再去溫習一下文章,才知如何下手。 同事也要更新程式,但不知如何發行套件.....雖有文章,但....還是不如作者在旁。
以上都是浪費大好青春的瑣事,這兩天剛好看到Azure Pipeline的介紹,就使用它來完成這....雜事吧。
使用方式 1.建立Pipeline
下一步:選擇git來源後,會產生一個Pipeline YAML,嗯...看不懂沒關係,右方的區塊有小助手會幫你,有各式各樣工作可以選擇,例如: VsBuild、MsBuild、Azure Publish等
2.修改YAML,以下為發行到Azure DevOps專案內的Artifacts
# ASP.NET Core (.NET Framework) # Build and test ASP.NET Core projects targeting the full .NET Framework. # Add steps that publish symbols, save build artifacts, and more: # https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core
trigger: none
pool:   vmImage: 'windows-latest'
variables:   solution: '**/*.sln'   buildPlatform: 'Any CPU'   buildConfiguration: 'Release'
steps: - task: NuGetToolInstaller@1
- task: NuGetCommand@2   displayName: 'Restore'   inputs:     restoreSolution: '$(solution)'
- task: VSBuild@1   displayName: 'Bui…

.Net Core 無法發行到IIS網站

圖片
前言 之前都是使用MsDeploy來發行.net framework專案,部份專案改用.Net Core後,部署到IIS,遇到一些無法發行的問題,例如:dll使用中,無法更新、驗證錯誤等。
執行環境 Window 10 .Net Core 3.1 Visual Studio 2019 Azure DevOps
問題排解 命令列,透過發行檔發行,需使用管理權限執行。 dotnet build -c Release /p:DeployOnBuild=true /p:PublishProfile=iis-remote  /p:Password=xxxx
1.dll使用中,無法更新
解決方式: 使用app_offline.htm,讓應用程式先停止。 在發行檔加入如下即可:     <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>
微軟文件寫道,專案檔上引用Microsoft.NET.Sdk.Web,在發行時就會自動加入app_offline並在發行後移除。             但我看專案明明就有引用,但就是試不出來....。-->此方式失敗,記錄備查 ps:在發行檔pubxml也試用,但沒用。
2.發行到遠方主機,出現憑證錯誤。
MSDEPLOY : error Code: ERROR_CERTIFICATE_VALIDATION_FAILED
解決方式:在發行檔加入如下:     <AllowUntrustedCertificate>true</AllowUntrustedCertificate>
3.在Azure DevOps 使用Pipeline發行時,出現SDK錯誤 ##[error]C:\Program Files\dotnet\sdk\3.1.302\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets(234,5): Error NETSDK1047: Assets file 'D:\a\1\s\Nop.Web\Server\obj\project.assets.json' doesn't have a target for '.NETCoreApp,…

.Net Core Identity 無法登入

圖片
前言 前陣子使用Blazor Assembly寫的一個Side Project給家人使用,這兩天反應無法登入,一直跳回Login。在反應的當下,我測試都正常,直到今天早上要登入時,出現了同樣的問題。 http status回應200,沒有任何錯誤訊息。
執行版本 .Net Core 3.1 Blazor Assembly 3.2.0 Microsoft.AspNetCore.Identity 3.1.7
原因
檢查console及Response Header,有警告訊息"Identity.External samesite=none; httponly...",判斷應該chrome 85針對SameStie更嚴格的限制造成的。
圖片來源 Ps:忘了擷圖XD,引用一張相似的。
關於SameStie SameStie是防止第三方Cookie的存取。 Strict : 嚴格限制。 Lax  : 只有Get 可以存取,Post不行。 本來預設是None ,Chrome在80之前會通知你要修改為Lax。 80之後,Lax為Chrome的預設值。意思是你不設定的話,預設為Lax。 ps:目前的程式不用更動。 .net 4.7.2 及 4.8後,Session,Cookie ,Form Auth Cookie 已預設為Lax None : 在https下,Secure設為true,第三方才可以存取。
解決方式
將Identity相關Cookie由原于的none設置成Lax。
1.設定Lax    services.ConfigureExternalCookie(options =>             {                 options.Cookie.SameSite =  Microsoft.AspNetCore.Http.SameSiteMode.Lax;             });             services.Configure<CookiePolicyOptions>(options =>             {                 options.MinimumSameSitePolicy = SameSiteMode.Lax;             });
2.啟用Cookie Policy    app.UseCookieP…

Facebook 取得粉絲頁資訊整理

圖片
前言    工作需求,需要取得自家粉絲頁的影片資訊。這幾天的搜尋及研究後,頭腦有點亂,整理一下相關內容及連結。
Token 區分 User Access Token:最常用的一種,讀寫用戶的Facebook資料,透過 login dialog經過用戶授權取得 App Access Token : 用來更改你的app設定或是發佈一些消息,透過server對facebook呼叫取得 Page Access Token : 跟User access token很像,但是它可以讀寫Facebook page的資料 Client Token:封裝在mobile apps或是桌面程式 參考: https://ithelp.ithome.com.tw/articles/10158130
取得粉絲頁影片資訊 取得粉絲頁的影片清單 需要Page Id,管理者在粉絲頁管理的"關於"可以取得。 需要權限:pages_read_engagement 內嵌影片播放器 API 事件控制 影片與直播是不同的API
Token 取得-使用工具 透過工具取得短期Token 個人、Page都可以 透過 Debuger可以換成三個月的Long Token 90天過期,若有使用則會繼續展延,若沒使用60天就會過期。 過期的token不可再拿來換新的。 可以透過API取得short-token,再去換long-token。 未過期的也可以使用long-token,換另一個long-token回來。
Token 取得-使用API 透過Fb API Client 取得短期Token 更換成長期Token及Page Token 需要App Id及App Secret 我的作法是換成長期Token後,再把它換成Page Token。ps:期限是永久的....不知什麼時時會失效。 pages_read_engagement:取得影片的權限Developer Mode下,可以直接使用 在Live Mode下,需要App Review相關權限。 申請權限,需要附上你的應用程式的操作畫面及影片 要通過個人或商業審核。 個人審核現在暫停中(已停4個月了)
App 啟用Live基本條件


相關參考 透過Fb API Client 取得短期Token 使用App Id,Secret更換成長期Token及Page Token Facebook api - 手動建立登入流程 Faceb…

ASP.NET MVC-Google Authenticator雙因素認證實作

圖片
前言
雙因素認證,除了Email及簡訊以外,另一選擇Google Authenticator。本文針對在ASP.NET MVC實作方式作說明。
實作
1.安裝動態密碼及QRCode套件
2.產生動態密碼的私鑰及BarcodeUrl       private GoogleAuthenticatorModel GenerateGoogleAuthenticatorModel()         {             byte[] secretByte = KeyGeneration.GenerateRandomKey(20);             string userName = "Kimxinfo";             string barcodeUrl = KeyUrl.GetTotpUrl(secretByte, userName) +  "&issuer=GoogleAuthenticatorLab";             var model = new GoogleAuthenticatorModel             {                 SecretKey = Base32Encoder.Encode(secretByte),                 BarcodeUrl = barcodeUrl             };             return model;         }
3.產生Barcode圖檔   private string GenerateQRCode(GoogleAuthenticatorModel model)         {             string fileUrl = $"~/temp/{model.SecretKey}.jpg";             string filePath = Server.MapPath(fileUrl);             QRCodeGenerator.ECCLevel eccLevel = QRCodeGenerator.ECCLevel.M;             using (QRCodeGenerator qrGenerator = new QRCodeGenerato…

Angular自訂後端Route

圖片
前言
原本開發的.Net Core程式,想要跟Angular並存,例如:路徑/kim開頭為Angular App,其他則使用MVC。
開發環境 Visual Studio 2019 .Net core 3.1 Angular 9
解決方式
修改Starup.cs,將原本的app.UseSpa 註解或移除        //app.UseSpa(spa =>             //{             //    // To learn more about options for serving an Angular SPA from  ASP.NET Core,             //    // see https://go.microsoft.com/fwlink/?linkid=864501             //    spa.Options.SourcePath = "ClientApp";             //    if (env.IsDevelopment())             //    {             //        spa.UseAngularCliServer(npmScript: "start");             //    }             //});
加入自訂Angular進入的Route,本例為 kim。 public-host:For Live Reload使用         app.Map("/kim", client =>             {                 client.UseSpa(spa =>                 {                     spa.Options.SourcePath = "ClientApp";                     if (env.IsDevelopment())                     {     //開發時期,需要指定base-href為kim    spa.UseAngularCliServer(npmScript: "start --   --base-href=/kim/ -…

Jenkins-備份鎖定錯誤

圖片
問題 公司的Jenkins,原本可以正常備份,但這幾天備份出現錯誤,如下訊息: [ERROR] org.codehaus.plexus.archiver.ArchiverException: Problem creating zip: The process cannot access the file because another process has locked a portion of the file org.jvnet.hudson.plugins.backup.BackupException: java.io.IOException: org.codehaus.plexus.archiver.ArchiverException: Problem creating zip: The process cannot access the file because another process has locked a portion of the file         at org.jvnet.hudson.plugins.backup.utils.BackupEngine.doBackup(BackupEngine.java:115)         at org.jvnet.hudson.plugins.backup.utils.BackupTask.run(BackupTask.java:130)         at java.lang.Thread.run(Unknown Source) Caused by: java.io.IOException: org.codehaus.plexus.archiver.ArchiverException: Problem creating zip: The process cannot access the file because another process has locked a portion of the file         at org.jvnet.hudson.plugins.backup.utils.BackupEngine.handleEnd(BackupEngine.java:104)         at org.apache.commons.io.DirectoryWalker.w…

WIX-建立URL註冊碼U啟動程式

圖片
前言    此篇今天在測試Notion筆記的桌面應用程式,針對在登入時,透過網頁啟動應用程式這個功能,感到有點好奇。雖然這不是很新奇的功能,幾年前就在iTune上看過,只是自己 寫的程式,都沒試著去作此功能。
實作
開始前,依照微軟提供的說明,我們需註冊URL相關機碼,reg範例檔案內容如下: [HKEY_CLASSES_ROOT\WixLab] @="URL:WixLab Protocol" "URL Protocol"=""
[HKEY_CLASSES_ROOT\kai\DefaultIcon] @="C:\\Program Files (x86)\\WixLab.WpfApp\\WpfApp.exe"
[HKEY_CLASSES_ROOT\WixLab\shell] @=""
[HKEY_CLASSES_ROOT\WixLab\shell\open] @=""
[HKEY_CLASSES_ROOT\WixLab\shell\open\command] @="C:\\Program Files (x86)\\WixLab.WpfApp\\WpfApp.exe /url \"%1\""
根據上方的機碼內容,在安裝程式時,將內容註冊進去。本範例使用Wix安裝範本作說明(關於Wix請參考)。 打開Product.wxs,新增一筆Component如下,紅字WixLab為Url Schema開頭。
    <!-- 註冊URL執行的機碼-->       <Component Id="RunURLComponent" Guid="*">         <RegistryKey Root="HKCR" Key="WixLab" >           <RegistryValue Type="string" Name="URL Protocol" Value=""/>           <RegistryValue Type="string"…