在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

 
原文地址:https://www.cnblogs.com/luanfukai/p/9488117.html