• 在ASP.NET Core 2.0 中使用 CookieAuthentication(新手学习修改)


    本人新手刚转 .NET Core 对于Core的某些方面是个小白,今天修改一个大神写的关于Authentication(认证)的认证,以便新手更容易的学习。


    在ASP.NET Core中关于Security有两个容易混淆的概念一个是Authentication(认证),一个是Authorization(授权)。而前者是确定用户是谁的过程,后者是围绕着他们允许做什么,今天的主题就是关于在ASP.NET Core 2.0中如何使用CookieAuthentication认证。

    在ASP.NET Core 2.0中使用CookieAuthentication跟在1.0中有些不同,需要在ConfigureServices和Configure中分别设置,前者我们叫注册服务,后者我们叫注册中间

    public void ConfigureServices(IServiceCollection services)
    {
       services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                        //后台管理员cookie服务
                        .AddCookie(options =>
                        {
                            options.LoginPath = "/Login/Index";//登录路径
                            options.LogoutPath = "/Login/Logout";//退出路径
                            options.AccessDeniedPath = new PathString("/Error/Forbidden");//拒绝访问页面
                            options.Cookie.Path = "/";
                        });

                services.AddMvc(options =>
                {
                    var policy = new AuthorizationPolicyBuilder()
                        .RequireAuthenticatedUser()
                        .Build();
                    // 因为是后台系统,必须登陆以后才能操作
                    options.Filters.Add(new AuthorizeFilter(policy));
                }); }

     登录路径方法需要允许匿名

      [AllowAnonymous]
        public class LoginController : Controller
        {
            public IActionResult Index()
            {
                return View();
            }
        }

    ------------------分割线,以上配置是后台系统使用,全部匿名不可访问,以下是局部控制器不可访问配置------------------------------------------------------------------------------------------------------------------------------------------------

    public void ConfigureServices(IServiceCollection services)
    {
       services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                        //后台管理员cookie服务
                        .AddCookie(options =>
                        {
                            options.LoginPath = "/Login/Index";//登录路径
                            options.LogoutPath = "/Login/Logout";//退出路径
                            options.AccessDeniedPath = new PathString("/Error/Forbidden");//拒绝访问页面
                            options.Cookie.Path = "/";
                        });
    
              services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    控制器需要设置不可匿名访问

      [Authorize]
        public class HomeController : Controller
        {
            public IActionResult Index()
            {
                return View();
            }
      }
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }
        app.UseStaticFiles();
    
      // 使用Authentication中间件,这里关于认证只有一个中间件,具体的认证策略将在服务中注册
        app.UseAuthentication();
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

    在配置服务方法中如果使用AddCookie(),没有任何参数,系统会为某些属性指定默认值

    public static class CookieAuthenticationDefaults
    {
        /// <summary>
        /// The default value used for CookieAuthenticationOptions.AuthenticationScheme
        /// </summary>
        public const string AuthenticationScheme = "Cookies";
    
        /// <summary>
        /// The prefix used to provide a default CookieAuthenticationOptions.CookieName
        /// </summary>
        public static readonly string CookiePrefix = ".AspNetCore.";
    
        /// <summary>
        /// The default value used by CookieAuthenticationMiddleware for the
        /// CookieAuthenticationOptions.LoginPath
        /// </summary>
        public static readonly PathString LoginPath = new PathString("/Account/Login");
    
        /// <summary>
        /// The default value used by CookieAuthenticationMiddleware for the
        /// CookieAuthenticationOptions.LogoutPath
        /// </summary>
        public static readonly PathString LogoutPath = new PathString("/Account/Logout");
    
        /// <summary>
        /// The default value used by CookieAuthenticationMiddleware for the
        /// CookieAuthenticationOptions.AccessDeniedPath
        /// </summary>
        public static readonly PathString AccessDeniedPath = new PathString("/Account/AccessDenied");
    
        /// <summary>
        /// The default value of the CookieAuthenticationOptions.ReturnUrlParameter
        /// </summary>
        public static readonly string ReturnUrlParameter = "ReturnUrl";
    }

    根据微软的命名规范在ConfigureServices统一使用Add***,在Configure统一使用Use***

    登陆代码

    public async Task<IActionResult> LoginDo()
    {
      var user = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, "bidianqing") }, CookieAuthenticationDefaults.AuthenticationScheme));
      await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, user, new AuthenticationProperties
      {
        IsPersistent = true,
        ExpiresUtc = DateTimeOffset.Now.Add(TimeSpan.FromDays(180))
      });
      return Redirect("/");
    }

    登出代码

    
    
    public async Task<IActionResult> Logout()
    {
        await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
        return Redirect("/");
    }
    
    

    读取配置

    public IActionResult Index()
            {
                if (HttpContext.User.Identity.IsAuthenticated)
                {
                    //这里通过 HttpContext.User.Claims 可以将我们在Login这个Action中存储到cookie中的所有
                    //claims键值对都读出来,比如我们刚才定义的UserName的值Wangdacui就在这里读取出来了
                    var userName = HttpContext.User.Claims.First().Value;
             // var id = httpContext.User.Claims.SingleOrDefault(s => s.Type == ClaimTypes.Sid).Value;
    } return View(); }

    原文地址:http://www.cnblogs.com/bidianqing/p/6870163.html

     
  • 相关阅读:
    【洛谷5052】[COCI2017-2018#7] Go(区间DP)
    【洛谷6564】[POI2007] 堆积木KLO(树状数组优化DP)
    【洛谷6940】[ICPC2017 WF] Visual Python++(扫描线)
    【洛谷6939】[ICPC2017 WF] Tarot Sham Boast(PGF结论题)
    【洛谷4123】[CQOI2016] 不同的最小割(最小割树)
    初学最小割树
    【洛谷6122】[NEERC2016] Mole Tunnels(模拟费用流)
    【洛谷6936】[ICPC2017 WF] Scenery(思维)
    【洛谷2805】[NOI2009] 植物大战僵尸(最大权闭合子图)
    【洛谷1393】Mivik 的标题(容斥+border性质)
  • 原文地址:https://www.cnblogs.com/luanfukai/p/9488117.html
Copyright © 2020-2023  润新知