来吧学学.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(20),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的同学有所帮助.如有志同道合者,欢迎加左上方群,一起学习进步.

原文地址:http://www.cnblogs.com/knowledgesea/p/7084419.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssl1760-商店选址问题【图论,最短路】

题目 给出一个城市的地图&#xff08;用邻接矩阵表示&#xff09;&#xff0c;商店设在一点&#xff0c;使各个地方到商店距离之和最短。 输入 第一行为n&#xff08;共有几个城市&#xff09;&#xff1b; N小于201 之后邻接矩阵 3 0 3 1 3 0 2 1 2 0 输出 最短路径…

JSP 获得服务器时间和浏览器时间

发布项目到服务器并访问 创建Web项目&#xff0c;开发静态页面 部署到服务器Tomcat 启动服务器Tomcat 不同用户通过浏览器来访问Web项目 Web项目和Java项目的区别 Web项目需要JavaEE的类库 Web项目中还可以存放静态网页和动态网页 开发目录和部署目录的区别 开发目录&…

如果要你选择某读书APP的图标,你会选择哪一个?

声明&#xff1a;介于尊重每位同学的劳动成果&#xff0c;故本文所有广告收入、赞赏均会均分给同学们&#xff01;最近学到了平面设计基础&#xff0c;于是让同学们用所学知识以“读书”为主题&#xff0c;原创了各式各样的图标&#xff0c;也许屏幕前的你只是轻轻的一划而过&a…

从理论知识到落地能力,你欠缺了什么?

转载自 从理论知识到落地能力&#xff0c;你欠缺了什么&#xff1f; 本文是一个理论过度到实践的典型案例&#xff0c;借助程序员经常遇到的一个问题——网络为什么不通&#xff0c;来具体说明怎么将书本上的死知识真正变成我们解决问题的能力。 大学学到的基本概念 我相信…

三大特性之多态性

1.理解多态性&#xff1a;可以理解为一个事物的多种形态。 2.何为多态性&#xff1a; 对象的多态性&#xff1a;父类的引用指向子类的对象&#xff08;或子类的对象赋给父类的引用&#xff09; 3.多态的使用&#xff1a;虚拟方法调用 有了对象的多态性以后&#xff0c;我们在编…

在这里,我们为您绘制了专属海报,请您查收!

树叶在空中飘荡&#xff0c;谱写着一曲感恩的乐章&#xff0c;那是大树对滋养它的大地的感恩;白云在蔚蓝的天空中飘荡&#xff0c;绘画着那一幅幅感人的画面&#xff0c;那是白云对哺育它的蓝天的感恩。我们沐浴着爱的阳光长大&#xff0c;我们滋润着人间的真情成长&#xff0c…

ssl1761-城市问题【图论,最短路,Dijkstra】

题目 一个图&#xff0c;输出从k点到每个点的最短路 输入 第一行有两个整数n和k&#xff0c;中间用空格隔开&#xff1b;以下是一个NxN的矩阵&#xff0c;表示点间的距离。 3 1 0 3 1 3 0 2 1 2 0 输出 输出点k到各点的距离 3 0 2 解题思路 用Dijkstra算法&#xff…

10分钟就能学会的.NET Core配置

.NET Core为我们提供了一套用于配置的API&#xff0c;它为程序提供了运行时从文件、命令行参数、环境变量等读取配置的方法。配置都是键值对的形式&#xff0c;并且支持嵌套&#xff0c;.NET Core还内建了从配置反序列化为POCO对象的支持。 目前支持以下配置Provider&#xff…

String 使用不当可能导致内存泄露

转载自 String 使用不当可能导致内存泄露 String是Java中一个比较基础的类&#xff0c;每一个开发人员都会经常接触到。而且&#xff0c;String也是面试中经常会考的知识点。String有很多方法&#xff0c;有些方法比较常用&#xff0c;有些方法不太常用。 今天介绍一个Strin…

instanceof关键字

instanceof关键字的使用 a instanceof A:判断对象a是否是类A的实例。如果是&#xff0c;返回true&#xff1b;如果不是&#xff0c;返回false。 使用情境&#xff1a;为了避免在向下转型时出现ClassCastException的异常&#xff0c;我们在向下转型之前&#xff0c;先 进行ins…

王宝兴同学谈学习!

对于学习&#xff0c;我认为心态很重要。只要我们明白就应做什么&#xff0c;此刻需要做什么&#xff0c;才能不断地向前迈进&#xff0c;直至终点。不要怕累。其实谁都一样&#xff0c;学习很累&#xff0c;可这个累只是暂时的。只要坚持下去&#xff0c;努力下去&#xff0c;…

ssl1614-医院设置【图论,最短路】

题目 一个像树一样的无向图&#xff0c;每个点有个值&#xff0c;每条边权值都是1&#xff0c;然后 若医院建在&#xff1a;   1处&#xff0c;则距离和4122*202*40136   3处&#xff0c;则距离和4*213204081 要求距离和最小 输入 第一行一个整数n&#xff0c;表示…

.NET Core运行时和基础类库性能提升

微软宣布改进了.NET Core运行时和基础类库的性能。虽然没有像改进ASP.NET Core的性能那样大肆宣传&#xff0c;但这些改进同样重要。 其中&#xff0c;以下10个方面的变化比较显著&#xff1a;集合、LINQ、压缩、加密、数学运算、序列化、文本处理、文件I/O、网络和并发。至于…

JSP 统计网站访问人数

统计访问人数1 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><base href"<%basePath%>…

阿里巴巴宣布开源限流降级中间件——Sentinel

转载自 阿里巴巴宣布开源限流降级中间件——Sentinel 近日&#xff0c;阿里巴巴中间件团队宣布开源 Sentinel&#xff0c;并发布了首个社区版本v0.1.0。GitHub地址为&#xff1a;https://github.com/alibaba/Sentinel 。 关于Sentinel&#xff0c;阿里巴巴给出的描述比较简单…

张君豪同学谈学习

开学也快一个月了&#xff0c;也渐渐适应了学校生活&#xff0c;与同学一起非常的开心&#xff0c;老师讲的课也听得更认真了&#xff0c;回想一下&#xff0c;过去的几周&#xff0c;还是有不少的感想啊&#xff0c;于是我就粗略的总结一下。因为某些原因&#xff0c;导致晚开…

== 和 equals() 区别

一、回顾 的使用&#xff1a;&#xff1a;运算符 1. 可以使用在基本数据类型变量和引用数据类型变量中 2. 如果比较的是基本数据类型变量&#xff1a;比较两个变量保存的数据是否相等。&#xff08;不一定类型要相同&#xff09;如果比较的是引用数据类型变量&#xff1a;比较…

JSP 登录案例实现

<h3>用户登录</h3> <form action"doLogin.jsp"> 账号&#xff1a;<input type"text" name"zh"/> 密码&#xff1a;<input type"password" name"pwd"> <input type"sub…

.NET Core 2.0 Preview2 发布汇总

前言 关于 ASP.NET Core 2.0 的新功能可以查看 Amazing ASP.NET Core 2.0。 这篇文章是 Priview2中的一些改进。 .NET Core 2.0 - Preview2 Azure 的改进Docker 镜像转移到了 Debian Stretch修复并支持 macOS High Sierra质量和性能的改进dotnet restore 将在 dotnet run,pu…

ssl1624-小萨的烦恼【图论,最短路,Floyd】

题目 一个图&#xff0c;只有一次快速的机会&#xff0c;不快速就得花双倍价格&#xff0c;求点1到点s的最短路&#xff0c;然后*2输出 输入 第一行有三个整数N、T、S 接下来是一个N*N的邻接矩阵。两点之间的距离不超过10^9。A[i,j]为0表示i和j不连通。 4 5 4 0 1 1 1 1…