手机版

详解ASP .净核心和ASP 网框架共享身份验证

时间:2021-09-07 来源:互联网 编辑:宝哥软件园 浏览:

。净核心已经热了好一阵子,1.1版本发布后其可用性也越来越高,开源、组件化、跨平台、性能优秀、社区活跃等等标签再加上"微软爸爸"主推和大力支持,尽管现阶段对比网络.框架还是比较"稚嫩",但可以想象到它光明的前景。作为。网开发者你是否已经开始尝试将项目迁移到。网核心上?这其中要解决的一个较大的问题就是如何让你的。净芯和老。网框架站点实现身份验证兼容!

1、第一篇章

我们先来看看。净芯中对身份的实现,在Startup.cs的安装使成形中配置饼干认证的相关属性

公共空配置(IApplicationBuilder应用程序,IHostingEnvironment env){ app .UseCookieAuthentication(新的CookieAuthenticationOptions { AuthenticationScheme=' test ',CookieName=' my okie ' });}控制器

public IActionResult Index(){ return View();}公共IActionResult log in(){ return View();}[http set]公共异步任务结果登录(字符串名称){ var identity=new ClaimsIdentity(新列表声明{新的索赔类型(声明类型。名称,名称,声明值类型字符串)},声明类型.身份验证,声明类型。名称,声明类型。角色);var principal=new ClaimSprincipal(标识);var properties=new AuthenticationProperties { IsPersistent=true };等待HttpContext .身份验证。签名同步("测试",主体,属性);返回RedirectToAction(' Index ');}登录视图

!DOCTYPE htmlhtmlhead标题登录/标题/床头柜表单ASP-控制器=“帐户”ASP-操作=“登录”方法='post '输入类型=“文本”名称=' name '/输入类型='提交'值='提交//表单/正文/htmlindex视图

!DOCTYPE htmlhtmlhead标题欢迎您[电子邮件保护]/标题/标题正文@ if(用户.身份验证过的){ p登录成功!/p }/body/html下面是实现效果的截图:

好吧,到此我们用。净芯比较简单地实现了用户身份验证信息的保存和读取。

接着思考,如果我的网络.框架项目想读取。网核心项目保存的身份验证信息应该怎么做?

要让两个项目都接受同一个身份至少需要三个条件:

CookieName必须相同饼干。的作用域名必须相同。两个项目的饼干认证必须使用同一个门票。首先我们对。网核心的饼干认证添加领域属性和票属性

公共void Configure(IAP presentonbuilder应用程序,IHostingEnvironment env){ var保护提供程序=数据保护提供程序.创建(新目录信息(@ ' c : \ KeyPath \ ');var数据保护器=保护提供商.CreateProtector(' mykokieauthentication ');var票证格式=新票证数据格式(数据保护程序);应用程序.UseCookieAuthentication(新的CookieAuthenticationOptions { AuthenticationScheme=' test ',CookieName=' MyCookie ',CookieDomain='localhost ',票证数据格式=票证格式});}此时我们在。净芯项目中执行用户登录,程序会在我们指定的目录下生成key.xml

我们打开文件看看程序帮我们记录了那些信息

?可扩展标记语言版本='1.0 '编码='utf-8 '?密钥id=' eb8b1b 59-DBC 5-4a 28-97 ad-2117 a2 E8 f 106 '版本='1 '创建日期2016-12-04t 08:27:27 . 8435415 z/创建日期激活日期2016-12-04t 08:2736027.8214603 z/激活日期到期日期ASP。NET核心。数据保护。验证加密。配置模型。Microsoft authenticatedencryptordescriptor序列化程序.AspNetCore。数据保护,版本=1.1.0.0,区域性=中性,公钥标记=ADB 9793829 DDE 60 '描述符加密算法='AES_256_CBC' /验证算法=' hmac sha 256 '/主密钥p 4:需要加密=' true ' xmlns : P4=' http://架构。net/2015/03/data protection ' valueyhdmeeyebzwpx 0 brz接下来我们开始配置网络.框架项目,同样,在Startup.cs中配置饼干认证的相关属性。

公共分部类启动{ public void Configuration(IAppBuilder app){ var protection provider=data protection provider .创建(新目录信息(@ ' c : \ KeyPath \ ');var数据保护器=保护提供商.CreateProtector(' mykokieauthentication ');var票证格式=新的aspnetticket数据格式(新的数据保护者垫片(数据保护者));应用程序.UseCookieAuthentication(新的CookieAuthenticationOptions { AuthenticationType=' test ',CookieName=' MyCookie ',CookieDomain='localhost ',票证数据格式=票证格式});} }视图

!title.net框架欢迎您[电子邮件保护]/标题/标题正文@ if(用户.身份验证){ p.net框架登录成功!/p }/body/html写法和。净芯基本上是一致的,我们来看下能否成功获取用户名:

反之在网络.框架中登录在。网核心中获取身份验证信息的方法是一样的,这里就不重复写了。

然而,到此为止事情就圆满解决了吗?很遗憾,麻烦才刚刚开始!

-

2、第二篇章

如果你的子项目不多,也不复杂的情况下,新增一个。净芯站点,然后适当修改以前的网络.框架站点,上述实例确实能够满足需求。可是如果你的子站点足够多,或者项目太过复杂,牵扯到的业务过于庞大或重要,这种情况下我们通常是不愿意动老项目的。或者说我们没有办法将所有的项目都进行更改,然后和新增的。净芯站点同时上线,如果这么做了,那么更新周期会拉的很长不说,测试和更新之后的维护阶段压力都会很大。所以我们必须要寻找到一种方案,让。净芯的身份验证机制完全迎合。网络框架。

因为网络.框架的甜饼干是对称加密,而。净芯是非对称加密,所以要在。净芯中动手的话必须要对。网核心默认的加密和解密操作进行拦截,如果可行的话最好的方案应该是将网络.框架的表单验证类移植到。网核心中。但是用反射镜看了下,牵扯到的代码太多,剪不断理还乱,github上也没找到其源码,瞎忙活了一阵之后终于感慨:臣妾做不到(﹏ )。

饼干认证的相关属性

应用程序.UseCookieAuthentication(新的CookieAuthenticationOptions { AuthenticationScheme=' test ',CookieName=' MyCookie ',CookieDomain='localhost ',票证数据格式=new formsauthticketdata格式(' ')});FormsAuthTicketDataFormat

公共类formsauthticketdata format : isecuredata format authenticationticket { private string _ authenticationScheme;public formsauthticketdata格式(string authenticationScheme){ _ authenticationScheme=authenticationScheme;} public AuthenticationTicket Unprotect(字符串protectedText,字符串用途){ var formsAuthTicket=GetFormsAuthTicket(受保护文本);var name=formsAuthTicket .名称;日期时间发布日期=formsAuthTicket .发布日期;日期时间到期=formsAuthTicket .到期;var索赔方=新索赔方(新索赔[] {新索赔(索赔类型。名称,名称)},' Basic ');var claimsPrincipal=new claimsPrincipal(claimsIdentity);var authProperties=新微软AspNetCore。Http。认证。authenticationproperties { issued TC=颁发的ate,expire SETC=expire };var ticket=new AuthenticationTicket(claimsPrincipal,authProperties,_ authenticationScheme);回程票;} FormsAuthTicket GetFormsAuthTicket(字符串cookie){返回DecryptCookie(cookie).结果;} async taskoformsauthticket DecryptCookie(字符串cookie){ Http client _ Http client=new Http client();var response=await _ httpClient .GetAsync(' http://192。168 .190 .134/用户/getMyTicket?cookie={ cookie } ');回应EnsureSuccessStatusCode();返回等待回应内容。ReadAsAsyncFormsAuthTicket();}}FormsAuthTicket

公共类FormsAuthTicket{公共日期时间到期{获取设置;}公共日期时间问题日期{获取设置;}公共字符串名称{获取设置;}}以上实现了对甜饼干的解密拦截,然后通过webapi从网络.框架获取票

[路由(' getmy ticket ')]公共IHttpActionResult getMyTicket(字符串cookie){ var formsAuthTicket=FormsAuthentication .解密(饼干);返回Ok(新的{ formsAuthTicket .名称,formsAuthTicket .发布日期,表单选择集。过期});}有了webapi这条线,解密解决了,加密就更简单了,通过webapi获取加密后的饼干。净芯要做的只有一步,保存甜饼干就行了

[http set]公共异步任务结果登录(字符串名称){ Http client _ Http client=new Http client();var response=await _ httpClient .GetAsync($ ' http://192。168 .190 .134/user/getmykokie?name={ name } ');回应EnsureSuccessStatusCode();字符串cookieValue=(等待响应内容。ReadAsStringAsync()).修剪(' \ ');CookieOptions=new CookieOptions();选项到期时间=日期时间.MaxValueHttpContext .回应。饼干。追加(' my kokie ',cookieValue,options);返回RedirectToAction(' Index ');}webapi获取甜饼干

[路由(' getmykokie ')]公共字符串getmykokie(字符串名称){ FormsAuthentication .SetAuthCookie(名称,假);返回表单验证GetAuthCookie(名称,false ).价值;}其余代码不用做任何更改,好吧,我们来测试一下

好吧,登录成功,至此完成网络.框架和。网核心身份验证的兼容,哎,如果。净芯的团队能多考虑一些这方面的兼容问题,哪怕是一个折中方案也能让开发者更有动力去做迁移。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

版权声明:详解ASP .净核心和ASP 网框架共享身份验证是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。