IdentityServer相關問題

identityServer4相關問題

前言

相信大家IdentityServer相關的文章、視頻已經看了不少。甚至實際也寫過一些相關的代碼。但是,要問你懂了里面的原理嗎?我感覺要打一個問號。這一篇不講原理,只講一下,ids4作為驗證中心,部署發(fā)布到K8s存在的一些問題。

chorme瀏覽器,使用Cookie認證失效。

參考文章:
https://juejin.im/post/6844904088165941262
https://blog.csdn.net/sinat_36521655/article/details/104844667

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

            services.AddAuthentication(options =>
                {
                    options.DefaultScheme = "Cookies";
                    options.DefaultChallengeScheme = "oidc";
                })
                .AddCookie("Cookies")
                .AddOpenIdConnect("oidc", options =>
                {
                    options.Authority = "http://localhost:5000";
                    options.RequireHttpsMetadata = false;

                    options.ClientId = "mvc";
                    options.SaveTokens = true;
                });
        }

上面的代碼是我的客戶端認證代碼,可以看到我的本地認證是用的“Cookies” 認證。我輸入賬戶密碼后, 通過http://localhost:5000這個地址認證,認證通過后,會往瀏覽器寫入一個Cookie,然后拿著這個cookie,跳轉訪問到我的MVC客戶端的主頁。但是我們發(fā)現(xiàn),登陸成功后,我們仍然跳轉到了登陸頁面。原因是:cookie寫入失敗,我們跳轉訪問MVC客戶端的主頁認證失敗,所以重新又跳回了登錄頁。

image.png

我們看到有兩個黃色的感嘆號,這代表我請求寫入cookie時失敗了。這是因為chorme的跨域cookie策略導致的,具體參考我上面的兩個鏈接的文章。那怎么解決呢?因為chorme是有一個策略,使用https時,可以跨站寫入cookie。但是我測試環(huán)境搭建https比較麻煩,我正式環(huán)境為了安全我還是用https。所以我們的解決方案如下:

1.ids4服務端加上cookie策略,當正式環(huán)境時,必須為https,測試環(huán)境時,可以用http

        public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, 
            IConfiguration configuration, IWebHostEnvironment environment)
        {
            services.AddAuthentication()
                .AddCookie(options =>
                {
                    options.Cookie.SameSite = SameSiteMode.None;
                    options.Cookie.HttpOnly = true;
                    options.Cookie.SecurePolicy = environment.IsDevelopment()
                        ? CookieSecurePolicy.SameAsRequest
                        : CookieSecurePolicy.Always;
                })

            return services;
        }

2.瀏覽器顯式關閉該功能。

地址欄輸入:chrome://flags/
找到SameSite by default cookies和Cookies without SameSite must be secure
將上面兩項設置為 Disable
這樣,我們問題就解決了。

授權服務(ids4)部署到k8s,驗證碼圖片看不到

參考文章:
https://www.cnblogs.com/stulzq/p/10172550.html
https://github.com/dotnet/dotnet-docker/issues/618

其實這個問題,跟ids4沒啥關系,只不過我們的登錄驗證這個項目叫identity,這個是用ids4驗證的,就一起寫了。我們的驗證碼請求訪問的是identity這個項目,但是我把它發(fā)布到k8s后發(fā)現(xiàn)看不到驗證碼的圖片。具體原因上面兩個文章寫的很清楚了,我就不寫了。寫這個只是上面的dockerfile和命令比較老,docker build時會報錯,所以解決方案 具體dockerfile如下:

FROM base AS final
WORKDIR /app

#解決驗證碼圖片不能顯示
RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list 
RUN apt-get update -y && apt-get install -y libgdiplus && apt-get clean && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll

#解決發(fā)布k8s后,連接sqlserver連不上
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /etc/ssl/openssl.cnf
RUN sed -i 's/MinProtocol = TLSv1.2/MinProtocol = TLSv1/g' /usr/lib/ssl/openssl.cnf
COPY --from=publish /app/publish .

各位只用將這兩行命令,復制進dockerfile就好,第一行是改鏡像源,為了加速。第二行是安裝。

RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list 
RUN apt-get update -y && apt-get install -y libgdiplus && apt-get clean && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll

授權服務(ids4)部署到k8s,偶爾登錄需要點兩次,不穩(wěn)定

因為ids4自帶antiforgery Token檢測,而antiforgery Token每次應用程序啟動都會變,所以分布式部署時,經常出現(xiàn)登錄點兩次,將antiforgery Token做持久化,并用redis保存就好

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容