<input id="ohw05"></input>
  • <table id="ohw05"><menu id="ohw05"></menu></table>
  • <var id="ohw05"></var>
  • <code id="ohw05"><cite id="ohw05"></cite></code>
    <label id="ohw05"></label>
    <var id="ohw05"></var>
  • Identity Service - 解析微軟微服務架構eShopOnContainers(二)

    上一篇,眾所周知一個網站的用戶登錄是非常重要,一站式的登錄(SSO)也成了大家討論的熱點。微軟在這個Demo中,把登錄單獨拉了出來,形成了一個Service,用戶的注冊、登錄、找回密碼等都在其中進行。

    這套service是基于IdentityServer4開發的, 它是一套基于 .Net Core的OAuth2和OpenID框架,這套框架目前已經很完善了,我們可以把它使用到任何項目中。

    我們先看下目錄結構:

    image

    從目錄結構可以看出它是一套MVC架構的網站,我們可以單獨進行運行和調試,當然,我們也可以把它放進自己的項目中。

    從.Net Core開始,我們看代碼的順序從Web.config轉到了Program.cs中,我們來看下IdentityService的Program:

    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseHealthChecks("/hc") //多了一個健康檢查
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();
    
            host.Run();
        }
    }

    跟普通的.Net Core項目類似,不過多了一個UseHealthChecks,從名字上也能看出,這是一個對項目健康的檢查,有興趣的話到時候我們另外開篇介紹。看完Program我們看下Startup

    在初始化的時候,我們看到的代碼基本與系統相同,多了一個加入builder.AddUserSecrets(), 這是一個用戶信息加密方法,避免我們在提交共享項目的時候,會把自己一些重要信息泄露,有興趣的朋友可以看下Secret Manager Tools

    在ConfigureServices中,我們看到有一段代碼:

    services.AddDataProtection(opts =>
    {
        opts.ApplicationDiscriminator = "eshop.identity";
    });

    這段代碼意思是加了一個唯一標示符給應用程序,這在集群環境中是非常必要的,我們可以通過這個唯一標識來判斷是否是同一個應用(我們的同一應用可能會分布在不同server上),具體可以看園內大神的專題:Asp.Net Core 數據保護

    Going Down:

    services.AddHealthChecks(checks =>
    {
        var minutes = 1;
        if (int.TryParse(Configuration["HealthCheck:Timeout"], out var minutesParsed))
        {
            minutes = minutesParsed;
        }
        checks.AddSqlCheck("Identity_Db", Configuration.GetConnectionString("DefaultConnection"), TimeSpan.FromMinutes(minutes));
    });

    又是Health檢查,這次檢查了與數據庫連接的狀態。

    services.AddTransient<IEmailSender, AuthMessageSender>();   //郵件發送服務
    services.AddTransient<ISmsSender, AuthMessageSender>();     //短信發送服務
    services.AddTransient<ILoginService<ApplicationUser>, EFLoginService>();    //EF 登錄服務
    services.AddTransient<IRedirectService, RedirectService>(); //重定向服務
    
    //callbacks urls from config:
    Dictionary<string, string> clientUrls = new Dictionary<string, string>();
    clientUrls.Add("Mvc", Configuration.GetValue<string>("MvcClient"));
    clientUrls.Add("Spa", Configuration.GetValue<string>("SpaClient"));
    clientUrls.Add("Xamarin", Configuration.GetValue<string>("XamarinCallback"));
    
    // Adds IdentityServer
    services.AddIdentityServer(x => x.IssuerUri = "null")
        .AddSigningCredential(Certificate.Get())
        .AddInMemoryApiResources(Config.GetApis())
        .AddInMemoryIdentityResources(Config.GetResources())
        .AddInMemoryClients(Config.GetClients(clientUrls))
        .AddAspNetIdentity<ApplicationUser>()
        .Services.AddTransient<IProfileService, ProfileService>();

    為identityserver4 進行相關配置。Startup中的Configure沒什么特別的。

    簡單的看了下Identity項目,好像就是教你怎么使用IdentityServer4,So,你可以在博客園中找到好多相關資料,這里就不重復介紹了。

    在這個service中,發現了很多沒有用到的類和屬性,估計是為了以后擴展用的吧。

    例如:

    var user = await _loginService.FindByUsername(model.Email);
    if (await _loginService.ValidateCredentials(user, model.Password))
    {
        AuthenticationProperties props = null;
        if (model.RememberMe)
        {
            props = new AuthenticationProperties
            {
                IsPersistent = true,
                ExpiresUtc = DateTimeOffset.UtcNow.AddYears(10)
            };
        };
    
        await _loginService.SignIn(user);
        // make sure the returnUrl is still valid, and if yes - redirect back to authorize endpoint
        if (_interaction.IsValidReturnUrl(model.ReturnUrl))
        {
            return Redirect(model.ReturnUrl);
        }
    
        return Redirect("~/");
    }

    這是AccountController用戶登錄的一段代碼,其中的props屬性進行了設置,但是在后面沒有使用到,因為是為以后支持持續化登錄做的準備吧。還有在Services目錄中的ProfileService,在項目中也沒有進行調用,相信在后面的版本中會加上去的。

    運行部署

    了解了項目后,我們再來進行運行和部署。

    首先,我們需要一臺MSSQL Server,因為我們需要保存用戶數據,建議用SQL 2008 update3以上,為何用update3以上后面會說,當然你也可以使用其他類型的數據庫,比如MySql,Sqlite等。

    其次,把Identity項目設置為啟動項目,試著Ctrl+F5運行,看看是否運行成功。

    afdd4fc5-de60-4ac6-ba1e-32bf2a776271

    當你能在瀏覽器看到這個頁面的時候,說明程序運行正常,配置也正確,接下來看下如何在docker中運行。

    1、右鍵項目-發布,把項目編譯發布到某個文件夾中。

    2、打開你的終端,如果是win10之前的系統,請打開Docker Quickstart Terminal

    我用的是win7,使用的是Quickstart終端,其他系統只要是使用linux container的都一樣,否則怎么叫“build once, run anywhere”呢。

    3、在終端上先cd到你的發布目錄,如果不在同一個驅動器下的,使用 /(driver)/ 代替driver:,例如,我的項目發布在D:\Projects\publish

        cd /d/projects/publish

    在你的終端看到輸入處上一行有這個目錄的,說明你已經進入到這個目錄了,如:

    image

    4、用ls查看下這個目錄,你會看到編譯后的文件都在這里(release),在文件夾中,你會看到dockerfile文件,這個相當于docker的批處理文件,我們看下內容,具體如何寫,可以看博客園中其他大神的教程:

    FROM microsoft/aspnetcore:1.1
    ARG source
    WORKDIR /app
    EXPOSE 80
    COPY ${source:-obj/Docker/publish} .
    ENTRYPOINT ["dotnet", "Identity.API.dll"]
    

    5、在終端運行docker build命令,創建你的image(請注意最后的“.”,這個代表的當前目錄):

    docker build -t identity:01 .

    6、成功后,我們使用docker images 可以查看,如果在list中有identity的話,說明我們創建成功了

    7、run起來

    docker run -p 8888:80 --name identity -d identity:01

    ok,所有操作完畢,可以用我們的瀏覽器打開,輸入http://localhost:8888

    imageimage

    撒都沒有,撒情況!!!!

    通過檢查,終于知道了原因,我們使用的docker-toolbox,所以它會借助于VritualBox來創建一個linux運行環境,所以我們必須把虛擬機中的端口映射到我的本機!

    d01f9762-76dd-45a4-82f3-a79f54b40718

    想著這下總歸可以了吧,誰知道。。。。。還是無法訪問,在quickstart中,我輸入了docker logs identity 看到如下日志:

    image

    這什么鬼,time out!!可我iis運行都是正常的啊,不存在數據庫連接不上的問題吧!這個問題足足困擾了我2天,晚上也睡不好,第3天早上,突然想到會不會linux容器的關系呢?之前google的都是錯誤信息,所以撒都沒有搜出來,我改了下關鍵字 linux containers connection sqlserver,果不其然,在一個issue中發現了答案:

    https://github.com/aspnet/EntityFramework/issues/4702#issuecomment-193382793

    原來我們的sql2008沒有支持這種登錄request,我們必須升級到update3才能解決這個問題,為了讓教程繼續,我購買了azure的1元試用,更換了connection后,我重新build和run,終于看到了熟悉的頁面:

    image

     

     

    寫在最后

    在Identity Service中,我們看到了一些新的東西,比如secret manager tool,healthcheck等,雖說它是基于identityServer4搭建的,但至少它教會了我們如何使用identityServer4,而且我們完全可以單獨把它拉出來作為我們自己的user server,我也是第一次接觸IdentityServer4,以后大家可以一起學習討論下,感覺非常強大。最后我們學習了如何單獨搭建和部署identity service,并使其能夠在docker中正常運行。

    PS:最近工作不是很忙,所以有些時間去研究這些,如果中途斷檔的話,還請大家見諒!

    posted @ 2017-05-31 09:16  James.Ying  閱讀(18330)  評論(27編輯  收藏  舉報
    国产美女a做受大片观看