ASP.NET Core 实现基本认证的示例代码_实用技巧

来源:脚本之家  责任编辑:小易  

我想问的是.NET Core 2.0好用吗?我也想转手做一下,又怕又是跟之前的什么mono一个模子刻出来的。现在已经有很多人在尝试了么?www.zgxue.com防采集请勿采集本网。

HTTP基本认证

在HTTP中,HTTP基本认证(Basic Authentication)是一种允许网页浏览器或其他客户端程序以(用户名:口令) 请求资源的身份验证方式,不要求cookie,session identifier、login page等标记或载体。

- 所有浏览器据支持HTTP基本认证方式

- 基本身证原理不保证传输凭证的安全性,仅被based64编码,并没有encrypted或者hashed,一般部署在客户端和服务端互信的网络,在公网中应用BA认证通常与https结合

https://en.wikipedia.org/wiki/Basic_access_authentication

BA标准协议

BA认证协议的实施主要依靠约定的请求头/响应头,典型的浏览器和服务器的BA认证流程:

① 浏览器请求应用了BA协议的网站,服务端响应一个401认证失败响应码,并写入WWW-Authenticate响应头,指示服务端支持BA协议

HTTP/1.1 401 Unauthorized

WWW-Authenticate: Basic realm="our site" # WWW-Authenticate响应头包含一个realm域属性,指明HTTP基本认证的是这个资源集

或客户端在第一次请求时发送正确Authorization标头,从而避免被质询

② 客户端based64(用户名:口令),作为Authorization标头值 重新发送请求。

Authorization: Basic userid:password

所以在HTTP基本认证中认证范围与 realm有关(具体由服务端定义)

> 一般浏览器客户端对于www-Authenticate质询结果,会弹出口令输入窗.

BA编程实践

aspnetcore网站利用FileServerMiddleware 将路径映射到某文件资源, 现对该 文件资源访问路径应用 Http BA协议。

ASP.NET Core服务端实现BA认证:

① 实现服务端基本认证的认证过程、质询逻辑

②实现基本身份认证交互中间件BasicAuthenticationMiddleware ,要求对HttpContext使用 BA.Scheme

③ASP.NET Core 添加认证计划 , 为文件资源访问路径启用 BA中间件,注意使用UseWhen插入中间件

using System;using System.Net.Http.Headers;using System.Security.Claims;using System.Text;using System.Text.Encodings.Web;using System.Threading.Tasks;using Microsoft.AspNetCore.Authentication;using Microsoft.Extensions.Logging;using Microsoft.Extensions.Options;namespace EqidManager.Services{ public static class BasicAuthenticationScheme { public const string DefaultScheme = "Basic"; } public class BasicAuthenticationOption:AuthenticationSchemeOptions { public string Realm { get; set; } public string UserName { get; set; } public string UserPwd { get; set; } } public class BasicAuthenticationHandler : AuthenticationHandler<BasicAuthenticationOption> { private readonly BasicAuthenticationOption authOptions; public BasicAuthenticationHandler( IOptionsMonitor<BasicAuthenticationOption> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock) { authOptions = options.CurrentValue; } /// <summary> /// 认证 /// </summary> /// <returns></returns> protected override async Task<AuthenticateResult> HandleAuthenticateAsync() { if (!Request.Headers.ContainsKey("Authorization")) return AuthenticateResult.Fail("Missing Authorization Header"); string username, password; try { var authHeader = AuthenticationHeaderValue.Parse(Request.Headers["Authorization"]); var credentialBytes = Convert.FromBase64String(authHeader.Parameter); var credentials = Encoding.UTF8.GetString(credentialBytes).Split(':'); username = credentials[0]; password = credentials[1]; var isValidUser= IsAuthorized(username,password); if(isValidUser== false) { return AuthenticateResult.Fail("Invalid username or password"); } } catch { return AuthenticateResult.Fail("Invalid Authorization Header"); } var claims = new[] { new Claim(ClaimTypes.NameIdentifier,username), new Claim(ClaimTypes.Name,username), }; var identity = new ClaimsIdentity(claims, Scheme.Name); var principal = new ClaimsPrincipal(identity); var ticket = new AuthenticationTicket(principal, Scheme.Name); return await Task.FromResult(AuthenticateResult.Success(ticket)); } /// <summary> /// 质询 /// </summary> /// <param name="properties"></param> /// <returns></returns> protected override async Task HandleChallengeAsync(AuthenticationProperties properties) { Response.Headers["WWW-Authenticate"] = $"Basic realm=\"{Options.Realm}\""; await base.HandleChallengeAsync(properties); } /// <summary> /// 认证失败 /// </summary> /// <param name="properties"></param> /// <returns></returns> protected override async Task HandleForbiddenAsync(AuthenticationProperties properties) { await base.HandleForbiddenAsync(properties); } private bool IsAuthorized(string username, string password) { return username.Equals(authOptions.UserName, StringComparison.InvariantCultureIgnoreCase) && password.Equals(authOptions.UserPwd); } }}

// HTTP基本认证Middleware public static class BasicAuthentication { public static void UseBasicAuthentication(this IApplicationBuilder app) { app.UseMiddleware<BasicAuthenticationMiddleware>(); } }public class BasicAuthenticationMiddleware{ private readonly RequestDelegate _next; private readonly ILogger _logger; public BasicAuthenticationMiddleware(RequestDelegate next, ILoggerFactory LoggerFactory) { _next = next; _logger = LoggerFactory.CreateLogger<BasicAuthenticationMiddleware>(); } public async Task Invoke(HttpContext httpContext, IAuthenticationService authenticationService) { var authenticated = await authenticationService.AuthenticateAsync(httpContext, BasicAuthenticationScheme.DefaultScheme); _logger.LogInformation("Access Status:" + authenticated.Succeeded); if (!authenticated.Succeeded) { await authenticationService.ChallengeAsync(httpContext, BasicAuthenticationScheme.DefaultScheme, new AuthenticationProperties { }); return; } await _next(httpContext); }}

// HTTP基本认证Middleware public static class BasicAuthentication { public static void UseBasicAuthentication(this IApplicationBuilder app) { app.UseMiddleware<BasicAuthenticationMiddleware>(); } }public class BasicAuthenticationMiddleware{ private readonly RequestDelegate _next; private readonly ILogger _logger; public BasicAuthenticationMiddleware(RequestDelegate next, ILoggerFactory LoggerFactory) { _next = next; _logger = LoggerFactory.CreateLogger<BasicAuthenticationMiddleware>(); } public async Task Invoke(HttpContext httpContext, IAuthenticationService authenticationService) { var authenticated = await authenticationService.AuthenticateAsync(httpContext, BasicAuthenticationScheme.DefaultScheme); _logger.LogInformation("Access Status:" + authenticated.Succeeded); if (!authenticated.Succeeded) { await authenticationService.ChallengeAsync(httpContext, BasicAuthenticationScheme.DefaultScheme, new AuthenticationProperties { }); return; } await _next(httpContext); }}

Startup.cs 文件添加并启用HTTP基本认证

services.AddAuthentication(BasicAuthenticationScheme.DefaultScheme) .AddScheme<BasicAuthenticationOption, BasicAuthenticationHandler>(BasicAuthenticationScheme.DefaultScheme,null);app.UseWhen( predicate:x => x.Request.Path.StartsWithSegments(new PathString(_protectedResourceOption.Path)), configuration:appBuilder => { appBuilder.UseBasicAuthentication(); } );

以上BA认证的服务端已经完成,现在可以在浏览器测试:

进一步思考?

浏览器在BA协议中行为: 编程实现BA客户端,要的同学可以直接拿去

/// <summary> /// BA认证请求Handler /// </summary> public class BasicAuthenticationClientHandler : HttpClientHandler { public static string BAHeaderNames = "authorization"; private RemoteBasicAuth _remoteAccount; public BasicAuthenticationClientHandler(RemoteBasicAuth remoteAccount) { _remoteAccount = remoteAccount; AllowAutoRedirect = false; UseCookies = true; } protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var authorization = $"{_remoteAccount.UserName}:{_remoteAccount.Password}"; var authorizationBased64 = "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(authorization)); request.Headers.Remove(BAHeaderNames); request.Headers.Add(BAHeaderNames, authorizationBased64); return base.SendAsync(request, cancellationToken); } } // 生成basic Authentication请求 services.AddHttpClient("eqid-ba-request", x => x.BaseAddress = new Uri(_proxyOption.Scheme +"://"+ _proxyOption.Host+":"+_proxyOption.Port ) ) .ConfigurePrimaryHttpMessageHandler(y => new BasicAuthenticationClientHandler(_remoteAccount){} ) .SetHandlerLifetime(TimeSpan.FromMinutes(2));仿BA认证协议中的浏览器行为

That's All . BA认证是随处可见的基础认证协议,本文期待以最清晰的方式帮助你理解协议:

实现了基本认证协议服务端,客户端;

到此这篇关于ASP.NET Core 实现基本认证的示例代码的文章就介绍到这了,更多相关ASP.NET Core基本认证内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网! 您可能感兴趣的文章:ASP.NET Core学习之使用JWT认证授权详解ASP.NET Core Authentication认证实现方法Asp.net Core中实现自定义身份认证的示例代码浅谈ASP.NET Core 中jwt授权认证的流程原理ASP.Net Core3.0中使用JWT认证的实现Asp.Net Core基于JWT认证的数据接口网关实例代码ASP.NET学习CORE中使用Cookie身份认证方法详解ASP.NET Core Token认证

.NET Core默认使用了ids4,而且基于2113.NET Core构建的5261网站大多数都是使用的这个注册和4102登陆的前端1653页面都在这里,这里使用了Razor语法,后台的登陆认证功能都集成在identityserver4里面了startup里面使用依赖注入引用了ids4更多追问追答追问你说“后台的登陆认证功能都集成在identityserver4里面了”,那这意思就是登录注册页面和登录逻辑是没法改的吗?要改就只能自己重新写一套,然后将注册和登录页面指定到新页面吗?追答你这么说我就知道你没什么开发经验但凡被大众普遍接受的组件通常可定制性都极高,会用的都随意定制了图一就是登录验证的逻辑,你看得懂知道什么意思就可以随意改,看不懂当然只能自己慢慢写了追问恩,确实没什么经验,^_^。图有点儿小啊,看不太清除,我看图一应该是默认创建的_LoginPartial.cshtml视图页是吧,你说这个就是登录验证的逻辑?这个页面不就是判断是否已经登录了吗?然后根据登录状态显示不用的菜单内容。并没有具体的登录逻辑啊,我说的登录逻辑是指的验证用户名密码那块的代码。求指点。追答图小可以左键点击图片向右拖动新建标签页打开图片登录验证逻辑被集成到Razor类库里面了另外所有的这些代码都是开源的github上都可以搜到源码,你想怎么改就怎么改,这个可能是FTP软件用于暂存的目录。你退出重新登录以下看看还有没有,若果删不来也可以不用管他,就是这么简单,1、右键项目添加-2、添加基架 - 选择标识3、选择你需要修改的页面布局或是全选,选择你的上下文4、添加就OK了。你想要的loginView就出来了,不知道为什么要问这些内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • 如何为checkboxlist和radiobuttonlist添加滚动条
  • asp.net 修复 iis 映射具体实现步骤
  • ubuntu16.4下用jexus部署asp.net core环境
  • aspnet core上实现web定时任务实例
  • aspnetpager对gridview分页并顺利导出excel
  • asp.net“服务器应用程序不可用” 解决方法
  • 解析.net 4.0 中委托delegate的使用详解
  • .net core单文件发布静态编译aot corert的方法详解
  • .net core类库system.reflection.dispatchproxy实现简易aop的方法
  • datareader不能使用using的详细示例
  • .net core 生成的身份认证的代码在哪?还有生成的注...
  • aspnetcore2使用IdentityServer4完成分布式部署认...
  • 磊科无线网卡一直在验证密码
  • 磊科路由器身份验证账号密码是什么
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础应用实用技巧自学过程首页asp.net实用技巧asp.net core学习之使用jwt认证授权详解asp.net core authentication认证实现方法asp.net core中实现自定义身份认证的示例代码浅谈asp.net core 中jwt授权认证的流程原理asp.net core3.0中使用jwt认证的实现asp.net core基于jwt认证的数据接口网关实例代码asp.net学习core中使用cookie身份认证方法详解asp.net core token认证如何为checkboxlist和radiobuttonlist添加滚动条asp.net 修复 iis 映射具体实现步骤ubuntu16.4下用jexus部署asp.net core环境aspnet core上实现web定时任务实例aspnetpager对gridview分页并顺利导出excelasp.net“服务器应用程序不可用” 解决方法解析.net 4.0 中委托delegate的使用详解.net core单文件发布静态编译aot corert的方法详解.net core类库system.reflection.dispatchproxy实现简易aop的方法datareader不能使用using的详细示例未将对象引用设置到对象的实例 (java正则表达式 pattern和matcheasp.net(c#)网页跳转七种方法小结未能加载文件或程序集“xxx”或它asp.net“服务器应用程序不可用”asp.net中的几种弹出框提示基本实asp.net gridview 72般绝技asp.net生成excel并导出下载五种asp.net对路径"xxxxx"asp.net汉字转拼音和获取汉字首字asp.net中如何实现回调.net core库类项目跨项目读取配置文件的方利用service fabric承载eshop on contain浅谈asp.net mvc应用程序的安全性asp.net cookie是怎么生成的(推荐)asp.net 动态生成表格.net core利用skiasharp文字头像生成方法asp.net(c#)应用程序配置文件app.config/动态itemtemplate的实现(译) - item,tempasp.net 在global中拦截404错误的实现方法
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved