介绍

***本文章发布于博客园:https://www.cnblogs.com/fallstar/p/11310749.html ***

作者:fallstar

本文章适用于:ASP.NET Core 2.1 +

今天想给一个asp.net core 的项目加上权限验证,于是研究了一下怎么加,

折腾了好一阵,发现原来Filter的方式被放弃了,现在使用Policy 和 Scheme 的方式来校验了。。。

然后开始猛查 msdn 和 stackoverflow ,然而。。。找到的都不合适,我就要简单容易的。。。

因为如果能直接用 AllowAnonymousAuthorize 可以省事好多的。

参照了 msdn ,有了第一版:

//Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(x =>
{
x.LoginPath = new PathString("/Home/Login");//登录页面
x.LogoutPath = new PathString("/Home/Logout");//登出页面
});
} //HomeController .cs
/// <summary>
/// 首页
/// </summary>
[Authorize]
public class HomeController : Controller
{
/// <summary>
/// 首页
/// </summary>
/// <returns></returns>
public IActionResult Index()
{
return View();
}
/// <summary>
/// 登录
/// </summary>
/// <returns></returns>
[AllowAnonymous]
public IActionResult Login()
{
return View();
}
/// <summary>
/// 登出
/// </summary>
/// <returns></returns>
public IActionResult Logout()
{
HttpContext.SignOutClain();
return RedirectToAction("Login");
}
}

上面的代码很简单,就用于授权跳转,Index是首页需要权限,Login可以匿名访问。

接着是用于提供拓展方法的WebHelper

直接在控制器的Action 里面调用 HttpContext.Login 就可以了。

    /// <summary>
/// Web帮助类
/// </summary>
public static class WebHelper
{
#region Auth
/// <summary>
/// 登录
/// </summary>
public static bool Login(this HttpContext context, string username,string password)
{
//验证登录
if (!(username != "admin" && password != "123456"))
return false;
//成功就写入
context.SignInClain(1, username, true, TimeSpan.FromHours(3));
return true;
} /// <summary>
/// 将登录用户信息写入凭据,输出到cookie
/// </summary>
/// <param name="context"></param>
/// <param name="userid"></param>
/// <param name="username"></param>
/// <param name="isAdmin"></param>
public static async void SignInClain(this HttpContext context, int userid, string username, bool isAdmin = false, TimeSpan? expire = null)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, username),
new Claim(ClaimTypes.NameIdentifier,userid.ToString()),
new Claim(ClaimTypes.Role,isAdmin?"1":"0")
};
if (!expire.HasValue)
expire = TimeSpan.FromHours(3); var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var authProperties = new AuthenticationProperties()
{
ExpiresUtc = DateTime.UtcNow.Add(expire.Value),
IsPersistent = true,
};
await context.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties);
} /// <summary>
/// 登出,清除登录信息
/// </summary>
/// <param name="context"></param>
public static async void SignOutClain(this HttpContext context)
{
await context.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
#endregion
}

当我以为完事的时候。。。突然发现webapi也被带到 登录页面去了。。。这肯定是不行的。

接着我有苦苦研究文档,没有收获,最后,我仔细的查看配置项里面的类,然后找到了办法。

最终版就是下面这段了:


public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.Lax;
}); services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(x =>
{
x.LoginPath = new PathString("/Home/Login");//登录页面
x.LogoutPath = new PathString("/Home/Logout");//登出页面
//多了下面这段针对WebApi的代码
x.Events.OnRedirectToLogin = z =>
{
if (z.HttpContext.Request.Path.StartsWithSegments("/api", StringComparison.OrdinalIgnoreCase))
{
z.HttpContext.Response.Redirect("/api/Login/UnAuth");//未授权错误信息的接口地址,返回json
}
else
{
z.HttpContext.Response.Redirect(z.RedirectUri);//其它安装默认处理
}
return Task.CompletedTask;
};
}); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
} public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//... app.UseCookiePolicy();
app.UseAuthentication(); //app.UseMvc }

OK大吉告成了~~

ASP.Net Core 2.1+ Cookie 登录授权验证【简单Cookie验证】的更多相关文章

  1. Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录

    1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...

  2. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-12基于cookie登录授权认证并实现前台会员、后台管理员同时登录

    1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...

  3. 【ASP.NET Core】运行原理(4):授权

    本系列将分析ASP.NET Core运行原理 [ASP.NET Core]运行原理(1):创建WebHost [ASP.NET Core]运行原理(2):启动WebHost [ASP.NET Core ...

  4. ASP.NET Core策略授权和 ABP 授权

    目录 ASP.NET Core 中的策略授权 策略 定义一个 Controller 设定权限 定义策略 存储用户信息 标记访问权限 认证:Token 凭据 颁发登录凭据 自定义授权 IAuthoriz ...

  5. asp.net Core 中AuthorizationHandler 实现自定义授权

    前言 ASP.NET Core 中 继承的是AuthorizationHandler ,而ASP.NET Framework 中继承的是AuthorizeAttribute. 它们都是用过重写里面的方 ...

  6. 第十五节:Asp.Net Core中的各种过滤器(授权、资源、操作、结果、异常)

    一. 简介 1. 说明 提到过滤器,通常是指请求处理管道中特定阶段之前或之后的代码,可以处理:授权.响应缓存(对请求管道进行短路,以便返回缓存的响应). 防盗链.本地化国际化等,过滤器用于横向处理业务 ...

  7. Asp.Net Core Identity 完成注册登录

    Identity是Asp.Net Core全新的一个用户管理系统,它是一个完善的全面的庞大的框架,提供的功能有: 创建.查询.更改.删除账户信息 验证和授权 密码重置 双重身份认证 支持扩展登录,如微 ...

  8. asp.net core 控制静态文件的授权

    静态文件访问在网站中是一项重要的服务,用于向前端提供可以直接访问的文件,如js,css,文档等,方法是在Startup的Configure中添加UseStaticFiles()管道. 参考:ASP.N ...

  9. ASP.NET Core 实现跨站登录重定向的新姿势

    作为 .NET 程序员,痛苦之一是自从 ASP.NET 诞生之日起直到最新的 ASP.NET Core 都无法直接实现跨站登录重定向(比如访问 https://q.cnblogs.com ,跳转到 h ...

随机推荐

  1. 算法练习题---罗马数字转int

    连接:https://leetcode-cn.com/problems/roman-to-integer/submissions/ 题目: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 ...

  2. edusoho上传视频弹出abort之解决方案

    错误描述:edusoho上传如avi.mp4等容量大的图片(如100m以上或500m等)弹出abort提示框 原因:是因为web服务器apache默认上传文件有限制导致的 解决办法如下: (1)首先修 ...

  3. python3中Requests将verify设置为False后,取消警告的方式

    import requests resp = requests.get('https://www.***.com', verify=False) 调用成功但是会有如下警告信息: InsecureReq ...

  4. 2019_软工实践_Beta(3/5)

    队名:955 组长博客:点这里! 作业博客:点这里! 组员情况 组员1(组长):庄锡荣 过去两天完成了哪些任务 文字/口头描述 ? 维持进度,检查需求 展示GitHub当日代码/文档签入记录 接下来的 ...

  5. Linux中mpstat命令参数详解

    Linux中mpstat命令参数详解 mpstat 是 Multiprocessor Statistics的缩写,是实时系统监控工具.其报告与CPU的一些统计信息,这些信息存放在 /proc/stat ...

  6. 将linux上的网站代码托管到gogs git服务器上进行实时同步(实战)

    一.说明 本说明只针对php,其他语言需要编译请用别的架构实现 二.实现效果 本地开发员门提交推送代码到git服务器,会立即同步更新网站服务器上代码 三.实战步骤小节 首次托管请先看   https: ...

  7. HTTP和HTTPS概念

    HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法. HTTPS(Hypertext Transfer ...

  8. oracle系列九 SET运算符查询

    将多个查询用 SET 操作符连接组成一个新的查询 UNION/UNION ALL INTERSECT MINUS 排序:ORDER BY UNION 操作符 UNION 操作符返回两个查询的结果集的并 ...

  9. nginx反向代理结合apache和php的配置示例

    .前端nginx主配置文件 # cat nginx.conf worker_processes ; #pid logs/nginx.pid; pid /data/www/logs/nginx.pid; ...

  10. 网页视频直播、微信视频直播技术解决方案:EasyNVR与EasyDSS流媒体服务器组合之区分不同场景下的直播接入需求

    背景分析 熟悉EasyNVR产品的朋友们都知道,EasyNVR不仅可以独成体系,而且还可以跟其他系列产品相配合,形成各种不同类型的解决方案,满足各种不同应用场景的实际需求.针对很多设备现场没有固定公网 ...