来吧学学.Net Core之登录认证与跨域资源使用
序言
学习core登录认证与跨域资源共享是越不过的砍,所以我在学习中同样也遇到啦这两个问题,今天我们就用示例来演示下使用下这2个技术点吧.
本篇主要内容如下:
1、展示一个登录认证的简单示例
2、跨域资源访问
3、跨域获取登录认证的用户信息
.Net Core使用身份认证(Authentication,Identity)制作登录认证功能
首先我们实现登录这个功能,代码如下
[Authorize]
public class AccountController : Controller
{
[HttpGet]
[AllowAnonymous]
public IActionResult Login(string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (this.User.Identity.IsAuthenticated)
{
return RedirectPermanent(returnUrl);
}
return View();
}
[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> Login(string userName, string password,string returnUrl=null)
{
ViewData["ReturnUrl"] = returnUrl;
if (!string.IsNullOrEmpty(userName) && userName == password)
{
var claims = new List<Claim>(){
new Claim(ClaimTypes.Name,userName),new Claim("password",password),new Claim("realname","张龙豪")
};
//init the identity instances
var userPrincipal = new ClaimsPrincipal(new ClaimsIdentity(claims, "Customer"));
//signin
await HttpContext.Authentication.SignInAsync("CookieAuth", userPrincipal, new AuthenticationProperties
{
ExpiresUtc = DateTime.UtcNow.AddMinutes(),
IsPersistent = false,
AllowRefresh = false
});
return RedirectPermanent(returnUrl);
}
else
{
ViewBag.ErrMsg = "UserName or Password is invalid";
return View();
}
}
前台代码如下
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Login</title>
</head>
<body>
<form asp-controller="Account" asp-action="Login" method="post" class="form-horizontal" asp-route-returnurl="@ViewData["ReturnUrl"]" role="form">
<div class="form-group">
<label class="col-md-2 control-label">UserName</label>
<div class="col-md-10">
<input type="text" name="username" />
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">Password</label>
<div class="col-md-10">
<input type="password" name="password" />
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<button type="submit" class="btn btn-default">Log in</button>
</div>
</div>
</form>
</body>
</html>
在Startup文件的Configure方法中加入下面代码
// 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)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationScheme = "CookieAuth", //认证方案:这是一个已知中间件的值,当有多个实例的中间件如果你想限制授权到一个实例时这个选项将会起作用。
LoginPath = new PathString("/Account/Login"), //登录路径:这是当用户试图访问资源但未经过身份验证时,程序将会将请求重定向到这个相对路径。
AccessDeniedPath = new PathString("/Account/Forbidden"), //禁止访问路径:当用户试图访问资源时,但未通过该资源的任何授权策略,请求将被重定向到这个相对路径。
AutomaticAuthenticate = true, //自动认证:这个标志表明中间件应该会在每个请求上进行验证和重建他创建的序列化主体。
AutomaticChallenge = true, //自动挑战:这个标志标明当中间件认证失败时应该重定向浏览器到登录路径或者禁止访问路径。
SlidingExpiration = true, //Cookie可以分为永久性的和临时性的。 临时性的是指只在当前浏览器进程里有效,浏览器一旦关闭就失效(被浏览器删除)。 永久性的是指Cookie指定了一个过期时间,在这个时间到达之前,此cookie一直有效(浏览器一直记录着此cookie的存在)。 slidingExpriation的作用是,指示浏览器把cookie作为永久性cookie存储,但是会自动更改过期时间,以使用户不会在登录后并一直活动,但是一段时间后却自动注销。也就是说,你10点登录了,服务器端设置的TimeOut为30分钟,如果slidingExpriation为false,那么10:30以后,你就必须重新登录。如果为true的话,你10:16分时打开了一个新页面,服务器就会通知浏览器,把过期时间修改为10:46。 更详细的说明还是参考MSDN的文档。
CookieHttpOnly = false //默认为true
});
好啦,你可以看到有[Authorize]属性的方法或者控制器都需要登录才能访问,如果没有登录是不允许访问的.
接下来你可能需要获取当前登录用户的用户信息,代码如下:
[HttpPost]
public string GetCurrUserRealname()
{
var s = this.User.Identities.First(u => u.IsAuthenticated).FindFirst("realname").Value;
var ss = this.User.Identity.Name;
return ss + ":" + s;
}
$.post("/Account/GetCurrUserRealname", null, function (data) { $("#content").html(data); });
ok,这样就能获取到当前登录的用户信息
那如何退出呢?代码如下:
public async Task<JsonResult> Logout()
{
await HttpContext.Authentication.SignOutAsync("CookieAuth");
return Json(new { data = "验证方案:CookieAuth退出成功" });
}
这样看来完整的登录验证就完成啦,但是目前位置,我的代码都还简单的要命,只能初学者拿来入手,具体还有很多东西可以扩展.我们需要自己思考学习.
.Net Core跨域资源访问
那这个跨域的环境呢,需要我们自己搞一下.怎么搞,如下
本地测试前期准备
1.首先我们搞两个core的站点


2.本地host配置两个域名,并在项目中做如下设置
hosts如下:

网站的launchSettings.json文件中配置项目CoreCorsATest为 "applicationUrl": "http://b.local.com:63455/", 项目AuthentiactionTest为 "applicationUrl": "http://a.local.com:50307/".
3. 实验约定:
我们在项目AuthentiactionTest中写接口,项目CoreCorsATest中调用AuthentiactionTest中的接口.
不做任何处理写接口跨域调用
AuthentiactionTest中写下如下接口
public class HomeController : Controller
{
public string GetName()
{
return "张龙豪";
}
CoreCorsATest中如下调用
$.post("http://a.local.com:50307/Home/GetName", null, function (data) { $("#content").html(data); });
结果如下:接口调用成功,但是跨域资源不允许使用

解决问题
设置跨域的域名
public void ConfigureServices(IServiceCollection services)
{
//services.AddAuthorization();
// Add framework services.
services.AddMvc();
services.AddCors(options => options.AddPolicy("AllowSameDomain", builder => builder.WithOrigins("http://a.local.com:50307", "http://b.local.com:63455")));
}
下面的两种调用方式
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseCors("AllowSameDomain");
public class HomeController : Controller
{
[EnableCors("AllowSameDomain")]
public string GetName()
{
return "张龙豪";
}
.Net Core跨域访问需要登录认证的资源
这个问题就是上面跨域访问的资源如果出现 [Authorize]特性,或者是访问当前用户的登录信息,用刚才的方法是不行的.
登录使用,上述的登录功能,接口如下
[HttpPost]
public string GetCurrUserRealname()
{
var s = this.User.Identities.First(u => u.IsAuthenticated).FindFirst("realname").Value;
var ss = this.User.Identity.Name;
return ss + ":" + s;
}
那在b.local.com 这个域名下怎么访问才是有效的呢?
需要下面两部操作
1.设置接口服务项目配置,如下操作
services.AddCors(options => options.AddPolicy("AllowSameDomain", builder => builder.WithOrigins("http://a.local.com:50307", "http://b.local.com:63455").AllowCredentials()));
2.ajax访问接口时
$.ajax({
type: 'POST',
url: "http://a.local.com:50307/Account/GetCurrUserRealname",
data: null,
dataType: "json",
xhrFields: {
withCredentials: true
},
success: function (result) {
$("#message").html(result);
}
});
ok,这样就可以访问到当前登录用户的信息啦
总结
本篇呢,写的都是用例,理论原理,没有涉及,也有一些其他常用额扩展点,都没有涉及到.
这里我只是把一些的点,贴出来,希望对想入手core的同学有所帮助.如有志同道合者,欢迎加左上方群,一起学习进步.
来吧学学.Net Core之登录认证与跨域资源使用的更多相关文章
- 基于CAS的SSO单点登录-实现ajax跨域访问的自动登录(也相当于超时重连)
先补课,以下网址可以把CAS环境搭起来. [JA-SIG CAS服务环境搭建]http://linliangyi2007.iteye.com/blog/165307 [JA-SIG CAS业务架构介绍 ...
- asp.net core webapi 服务端配置跨域
在前后端分离开发中服务端仅仅只为前端提供api接口,并且前后端往往单独部署,此时就会出现浏览器跨域问题.asp.net core提供了简单优雅的解决方案. 在startup文件的Configure添加 ...
- 逐步搭建vs2015的API自带认证调用+跨域调用
demo百度网盘链接:https://pan.baidu.com/s/1HJ19RJwS6qCixui8KF8QBg 提取码:yt1c 首先我们建立一个webapi项目,这个就不需要小编解释了.如下图 ...
- 单点登录之ajax跨域实现
需求:相同根域名或不同根域名的两个域名,实现单点登录登出 原理: 以b站为例,b站的账号登录域名为passport.bilibili.com.主站为www.bilibili.com,游戏站为www.b ...
- DRF序列化、认证、跨域问题
初级 #models.py from django.db import models class User(models.Model): user = models.CharField(max_len ...
- C# ASP.NET MVC/WebApi 或者 ASP.NET CORE 最简单高效的跨域设置
概述 前面写了一篇:<C# ASP.NET WebApi 跨域设置>的文章,主要针对 ASP.NET WebApi 项目. 今天遇到 ASP.NET MVC 项目也需要设置跨域,否则浏览器 ...
- asp.net core 2.0 api ajax跨域问题
API配置: services.AddCors(options => { options.AddPolicy("any", builder => { builder.W ...
- 单点登录 关于Cookie跨域的问题
public void ProcessRequest(HttpContext context) { HttpCookie cookie = new HttpCookie("name" ...
- ASP.NET Core 3.1 WebAPI的跨域问题
1.nuget要加上 Microsoft.AspNetCore.Cors 中间件. 2.在Startup类里先定义一个全局变量. private readonly string AllowSpecif ...
随机推荐
- Haoop基本操作
一.HDFS的常用操作 (一).HDFS文件的权限 与Linux文件权限类似 r: read; w:write; x:execute,权限x对于文件忽略,对于文件夹表示是否允许访问其内容. 如果Lin ...
- Java并发,看到了,就记录下呗
在这篇博客中,主要把之前看的书的内容记录一下,个人感觉还是可以的,原题是这样的:开发一个高效的缓存.这里指的是单机. 首先我来看当前的一个版本 public interface Computable& ...
- scala 异常处理机制
有经验的码农都知道,程序开发的差不多的时候,为了提高程序的稳健性,是一定要加上异常处理机制的 在scala中,用try/catch/finally实现该功能,这个在我的博客,数字转汉字小工具中有体现, ...
- 介绍几个python的音频处理库
一.eyeD3 直接在google上搜索python mp3 process ,推荐比较多的就是这个第三方库了.先来看看官方介绍吧. About eyeD3 is a Python tool for ...
- React入门---开始前的准备(下)-3
React开始前的准备(下): ·配置webpack热加载(热加载就是修改js文件,点击保存之后,浏览器会自动刷新,提高开发效率) 1. 全局安装: npm install webpack -g np ...
- angular.js实现省市区三级联动指令
不多说,直接上代码,一开始搞了好久,最后才弄懂,希望对大家有帮助 1.jade div.col-md-2 select.form-control(ng-options="value.code ...
- DIV上下居中
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 029 hibernate抓取策略
实例A引用实例B,B如果是代理的话(比如多对一关联中):如果遍历A的查询结果集(假设有10条记录),在遍历A的时候,访问B变量,将会导致n次查询语句的发出!这个时候,如果在B一端的class上配置ba ...
- 开关调色新世界BP2888电源解决方案
LED智能方案经过几年的拼杀,已经风靡照明界.但人们渐渐发现,对照明来说,一味追求花哨的功能并不被市场所认同,而其中开关调色,以其简单易操作的特点,已逐步融入广大消费者的生活习惯中.对吸顶灯,面板灯等 ...
- 日志组件一:Log4j
log4j是Apache的一个开源项目,陪伴了我们多年,但是现在已经不更新了.官网原文如下: Log4j 1.x has been widely adopted and used in many ap ...