netcore 运行时重写cookie认证配置

2/23/2022 3:54:01 PM
732
0

需求:要实现运行状态下修改管理后台的页面地址

实现:使用urlRewrite 来实现

 

netcore已经为我们做好了url重写中间件

  services.AddSingleton<RewriteOptions>();  这里注入 RewriteOptions  为了使运行时能够动态添加url重写路径配置,注册成单例
 RewriteOptions options = app.ApplicationServices.GetService(typeof(RewriteOptions)) as RewriteOptions;
 
 options.AddRewrite("admins/(.*)", "admin/$1", skipRemainingRules: true);
 /*可以增加更多的重写配置*/
 app.UseRewriter(options);

上面代码中的  admins  是要求灵活配置的,可能是 adm/ cadm / hhh /等,用户任意配置的

这些几句就可以实现重写了,当然,如果碰到 /admin开头的地址,你可以配置返回 404

 app.MapWhen(context => context.Request.Path.StartsWithSegments("/admin"), appBuilder =>
                {
                    appBuilder.Run(async (context) =>
                    {
                        context.Response.StatusCode = StatusCodes.Status404NotFound;
                        await context.Response.WriteAsync("这里写上404的提示语句,理论上可以直接响应一个html页面接口的代码");
                    });
                });

又因为我的登录地址也在 /admin  下,此时导致了用户未登录会跳转到  /admin/account/login 地址上,这个此时时404 ,因为我们上边对 /admin 做了404响应,以及和下面代码的综合作用

 services.AddAuthentication(options =>
            {
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; ;
            
            }).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
                 {
                     options.ClaimsIssuer = "npress";   //发行者
                     options.Cookie.Name = "identity";
                     options.Cookie.HttpOnly = true;     //只读
                     options.AccessDeniedPath = "/admin/account/forbidden";
                     options.LoginPath = "/admin/account/login";
                     Configuration.Bind("CookieSettings", options);
                 });

此时有两个解决方案,写一个中间页面,不在 admin下的页面,来检测用户对后台地址的配置,然后跳转

另外一个方案就是修改 "options.LoginPath"

方案一不表述了

下面讲下方案二的做法:运行时修改 cookie 的 LoginPath 

IOptionsMonitor<CookieAuthenticationOptions>  cookieMonitor = app.ApplicationServices.GetService(typeof(IOptionsMonitor<CookieAuthenticationOptions>)) as      IOptionsMonitor<CookieAuthenticationOptions>;
               
CookieAuthenticationOptions cookiesOptions = cookieMonitor.Get(CookieAuthenticationDefaults.AuthenticationScheme);  //因为这里我们用的是默认的  scheme名字(Cookies)
cookiesOptions.LoginPath = "/" + admin_address_folder + "/account/login";
cookiesOptions.AccessDeniedPath = "/" + admin_address_folder + "/account/forbidden";

上面代码可以在启动时配置到 starup中

也可以在 action中执行,都能达到执行效果

 

 

全部评论



提问