序言

学习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之登录认证与跨域资源使用的更多相关文章

  1. 基于CAS的SSO单点登录-实现ajax跨域访问的自动登录(也相当于超时重连)

    先补课,以下网址可以把CAS环境搭起来. [JA-SIG CAS服务环境搭建]http://linliangyi2007.iteye.com/blog/165307 [JA-SIG CAS业务架构介绍 ...

  2. asp.net core webapi 服务端配置跨域

    在前后端分离开发中服务端仅仅只为前端提供api接口,并且前后端往往单独部署,此时就会出现浏览器跨域问题.asp.net core提供了简单优雅的解决方案. 在startup文件的Configure添加 ...

  3. 逐步搭建vs2015的API自带认证调用+跨域调用

    demo百度网盘链接:https://pan.baidu.com/s/1HJ19RJwS6qCixui8KF8QBg 提取码:yt1c 首先我们建立一个webapi项目,这个就不需要小编解释了.如下图 ...

  4. 单点登录之ajax跨域实现

    需求:相同根域名或不同根域名的两个域名,实现单点登录登出 原理: 以b站为例,b站的账号登录域名为passport.bilibili.com.主站为www.bilibili.com,游戏站为www.b ...

  5. DRF序列化、认证、跨域问题

    初级 #models.py from django.db import models class User(models.Model): user = models.CharField(max_len ...

  6. C# ASP.NET MVC/WebApi 或者 ASP.NET CORE 最简单高效的跨域设置

    概述 前面写了一篇:<C# ASP.NET WebApi 跨域设置>的文章,主要针对 ASP.NET WebApi 项目. 今天遇到 ASP.NET MVC 项目也需要设置跨域,否则浏览器 ...

  7. asp.net core 2.0 api ajax跨域问题

    API配置: services.AddCors(options => { options.AddPolicy("any", builder => { builder.W ...

  8. 单点登录 关于Cookie跨域的问题

    public void ProcessRequest(HttpContext context) { HttpCookie cookie = new HttpCookie("name" ...

  9. ASP.NET Core 3.1 WebAPI的跨域问题

    1.nuget要加上 Microsoft.AspNetCore.Cors 中间件. 2.在Startup类里先定义一个全局变量. private readonly string AllowSpecif ...

随机推荐

  1. c# post basic 接口

    string url = "http://xxxxxxxxx";//地址,请反复检查地址的准确性 string usernamePassword = "username: ...

  2. CompletionService 简介

    以下是jdk关于CompletionService的简介: public interface CompletionService<V> 将生产新的异步任务与使用已完成任务的结果分离开来的服 ...

  3. 【PHP】文件写入和读取详解

    文章提纲: 一.实现文件读取和写入的基本思路 二.使用fopen方法打开文件 三.文件读取和文件写入操作 四.使用fclose方法关闭文件 五.文件指针的移动 六.Windows和UNIX下的回车和换 ...

  4. 编程语言与C语言的简介

    1.什么是程序 指挥计算机执行我们想要它做的动作,而依照顺序执行的一组指令 2.程序的作用是什么 指挥计算机工作 3.程序的特征 1.程序是一行一行的执行 2.是一种与计算机沟通的语言 3.程序是由特 ...

  5. 14、Iterator跟ListIterator的区别

    14.Iterator与ListIterator的区别 在使用List,Set的时候,为了实现对其数据的遍历,会经常使用到Iterator(跌代器).使用跌代器,不需要干涉其遍历的过程,只需要每次取出 ...

  6. Tomcat 部署项目的三种方法

    1.下载 Tomcat 服务器 ①.官网下载地址:http://tomcat.apache.org/ ②.tomcat 8.0 64位百度云下载地址:http://pan.baidu.com/s/1s ...

  7. 《JAVA与模式》之门面模式

    <JAVA与模式>之门面模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述门面(Facade)模式的: 门面模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的 ...

  8. JavaScript 闭包究竟是什么

    用JavaScript一年多了,闭包总是让人二丈和尚摸不着头脑.陆陆续续接触了一些闭包的知识,也犯过几次因为不理解闭包导致的错误,一年多了 资料也看了一些,但还是不是非常明白,最近偶然看了一下 jQu ...

  9. 模仿ICE的structured panorama小按钮

    这个按钮的目的是用于手动排列图片序列,应该说写得比较精巧,我使用csharp进行模仿,主要采用的是自动控件创建技术.结果比较简陋,实现功能而已,放出来大家一起学习. ;        ;        ...

  10. R – GPU Programming for All with ‘gpuR’

    INTRODUCTION GPUs (Graphic Processing Units) have become much more popular in recent years for compu ...