.net core 1.0 實(shí)現(xiàn)單點(diǎn)登錄負(fù)載多服務(wù)器

字號(hào):


    這篇文章主要介紹了.net core 1.0 實(shí)現(xiàn)單點(diǎn)登錄負(fù)載多服務(wù)器的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友可以參考下
    前言
    .net core 出來有一時(shí)間了,這段時(shí)間也一直在做技術(shù)準(zhǔn)備,目前想做一個(gè)單點(diǎn)登錄(SSO)系統(tǒng),在這之前用.net時(shí)我用習(xí)慣了machineKey ,也順手在.net core 中嘗試了一上,結(jié)果發(fā)現(xiàn)不好使了,也不起作用,于是開始了網(wǎng)上學(xué)習(xí)。
    實(shí)現(xiàn)方法
    功夫不負(fù)有心人,網(wǎng)上高人還是多,在github.com上面ISSUES中也有人在討論此問題,于是找到代碼嘗試,結(jié)果實(shí)現(xiàn)了。
    直接上代碼,我們需要先封裝一個(gè)XmlRepository,Key的格式如下:
    <?xml version="1.0" encoding="utf-8"?>
    <key id="cbb8a41a-9ca4-4a79-a1de-d39c4e307d75" version="1">
     <creationDate>2016-07-23T10:09:49.1888876Z</creationDate>
     <activationDate>2016-07-23T10:09:49.1388521Z</activationDate>
     <expirationDate>2116-10-21T10:09:49.1388521Z</expirationDate>
     <descriptor deserializerType="Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=1.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
      <descriptor>
       <encryption algorithm="AES_256_CBC" />
       <validation algorithm="HMACSHA256" />
       <masterKey p4:requiresEncryption="true" xmlns:p4="http://schemas.asp.net/2015/03/dataProtection">
        <!-- Warning: the key below is in an unencrypted form. -->
        <value>WYgZNh/3dOKRYJ1OAhVqs56pWPMHei15Uj44DPLWbYUiCpNVEBwqDfYAUq/4jBKYrNoUbaRkGY5o/NZ6a2NTwA==</value>
       </masterKey>
      </descriptor>
     </descriptor>
    </key>
    XmlRepository代碼:
    public class CustomFileXmlRepository : IXmlRepository
      {
        private readonly string filePath = @"C:\keys\key.xml";
        public virtual IReadOnlyCollection<XElement> GetAllElements()
        {
          return GetAllElementsCore().ToList().AsReadOnly();
        }
        private IEnumerable<XElement> GetAllElementsCore()
        {
          yield return XElement.Load(filePath);
        }
        public virtual void StoreElement(XElement element, string friendlyName)
        {
          if (element == null)
          {
            throw new ArgumentNullException(nameof(element));
          }
          StoreElementCore(element, friendlyName);
        }
        private void StoreElementCore(XElement element, string filename)
        {
        }
      }
    Startup代碼:
    public class Startup
      {
        public Startup(IHostingEnvironment env)
        {
          var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();
          Configuration = builder.Build();
        }
        public IConfigurationRoot Configuration { get; }
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
          services.AddSingleton<IXmlRepository, CustomFileXmlRepository>();
          services.AddDataProtection(configure =>
          {
            configure.ApplicationDiscriminator = "Htw.Web";
          });
          // Add framework services.
          services.AddMvc();
        }
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
          loggerFactory.AddConsole(Configuration.GetSection("Logging"));
          loggerFactory.AddDebug();
          if (env.IsDevelopment())
          {
            app.UseDeveloperExceptionPage();
            app.UseBrowserLink();
          }
          else
          {
            app.UseExceptionHandler("/Home/Error");
          }
          app.UseStaticFiles();
          app.UseCookieAuthentication(new CookieAuthenticationOptions()
          {
            AuthenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme,
            LoginPath = new PathString("/Account/Unauthorized/"),
            AccessDeniedPath = new PathString("/Account/Forbidden/"),
            AutomaticAuthenticate = true,
            AutomaticChallenge = false,
            CookieHttpOnly = true,
            CookieName = "MyCookie",
            ExpireTimeSpan = TimeSpan.FromHours(2),
    #if !DEBUG
            CookieDomain="h.cn",
    #endif
            DataProtectionProvider = null
          });
          app.UseMvc(routes =>
          {
            routes.MapRoute(
              name: "default",
              template: "{controller=Home}/{action=Index}/{id?}");
          });
        }
      }
    登錄代碼:
    public async void Login()
      {
        if (!HttpContext.User.Identities.Any(identity => identity.IsAuthenticated))
        {
          var user = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, "bob") }, CookieAuthenticationDefaults.AuthenticationScheme));
          await HttpContext.Authentication.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, user);
          HttpContext.Response.ContentType = "text/plain";
          await HttpContext.Response.WriteAsync("Hello First timer");
        }
        else
        {
          HttpContext.Response.ContentType = "text/plain";
          await HttpContext.Response.WriteAsync("Hello old timer");
        }
      }
    注意
    C:\keys\key.xml 這個(gè)文件路徑可以更改,還有就是也可用共享目錄或數(shù)據(jù)庫來實(shí)現(xiàn)統(tǒng)一管理到此可以登錄試一下。
    以上所述是小編給大家介紹的.net core 1.0 實(shí)現(xiàn)單點(diǎn)登錄負(fù)載多服務(wù)器的全部敘述,希望對(duì)大家有所幫助!