Asp.net core ASP.NET内核中的基本身份验证
问题 如何在ASP.NET核心web应用程序中使用自定义成员身份实现基本身份验证 注释Asp.net core ASP.NET内核中的基本身份验证,asp.net-core,basic-authentication,asp.net-core-mvc,asp.net-core-1.0,Asp.net Core,Basic Authentication,Asp.net Core Mvc,Asp.net Core 1.0,问题 如何在ASP.NET核心web应用程序中使用自定义成员身份实现基本身份验证 注释 在MVC5中,我使用了本文中的说明,其中要求在WebConfig中添加一个模块 我仍然在IIS上部署新的MVC核心应用程序,但这种方法似乎不起作用 我也不想使用IIS内置支持进行基本身份验证,因为它使用Windows凭据 ASP.NET安全性将不包括基本身份验证中间件,因为它可能存在不安全和性能问题 如果出于测试目的需要基本身份验证中间件,请查看我们通过使用ActionFilter为内部服务实现的摘要
- 在MVC5中,我使用了本文中的说明,其中要求在
中添加一个模块WebConfig
- 我仍然在
上部署新的IIS
应用程序,但这种方法似乎不起作用MVC核心
- 我也不想使用IIS内置支持进行基本身份验证,因为它使用Windows凭据
如果出于测试目的需要基本身份验证中间件,请查看我们通过使用ActionFilter为内部服务实现的摘要安全:
公共类DigestAuthenticationFilterAttribute:ActionFilterAttribute
{
private const string AUTH_HEADER_NAME=“Authorization”;
private const string AUTH_METHOD_NAME=“Digest”;
私人身份验证设置\u设置;
公共摘要AuthenticationFilterAttribute(IOPS设置)
{
_设置=设置.值;
}
公共重写无效OnActionExecuting(ActionExecutingContext上下文)
{
ValidateSecureChannel(context?.HttpContext?.Request);
ValidateAuthenticationHeader(context?.HttpContext?.Request);
base.OnActionExecuting(上下文);
}
私有void ValidateSecureChannel(HttpRequest请求)
{
if(_settings.RequireSSL&!request.IsHttps)
{
抛出新的AuthenticationException(“必须使用HTTPS调用此服务”);
}
}
私有void ValidateAuthenticationHeaders(HttpRequest请求)
{
字符串authHeader=GetRequestAuthorizationHeaderValue(请求);
字符串摘要=(authHeader!=null&&authHeader.StartsWith(AUTH\u METHOD\u NAME))?authHeader.Substring(AUTH\u METHOD\u NAME.Length):null;
if(string.IsNullOrEmpty(摘要))
{
抛出新的AuthenticationException(“您必须使用授权标头发送凭据”);
}
if(digest!=CalculateSHA1($“{u settings.UserName}:{{u settings.Password}”))
{
抛出新的AuthenticationException(“无效凭据”);
}
}
私有字符串GetRequestAuthorizationHeaderValue(HttpRequest请求)
{
return request.Headers.Keys.Contains(AUTH\u HEADER\u NAME)?request.Headers[AUTH\u HEADER\u NAME]。First():null;
}
公共静态字符串CalculateSHA1(字符串文本)
{
var sha1=System.Security.Cryptography.sha1.Create();
var hash=sha1.ComputeHash(Encoding.UTF8.GetBytes(text));
返回Convert.tobase64字符串(散列);
}
}
之后,您可以注释要使用摘要安全性访问的控制器或方法:
[路线(“api/xxxx”)]
[ServiceFilter(类型(DigestAuthenticationFilterAttribute))]
公共类MyController:Controller
{
[HttpGet]
公共字符串Get()
{
回复“你好”;
}
}
要实现基本的安全性,只需将DigestAuthenticationFilterAttribute更改为不使用SHA1,而是直接对授权头进行Base64解码。ASP.NET Core 2.0引入了对身份验证和标识的突破性更改 在1.x上,通过中间件配置身份验证提供程序(作为可接受答案的实现)。 在2.0上,它基于服务 有关MS文档的详细信息: 我已经为ASP.NET Core 2.0编写了一个基本身份验证实现,并发布到NuGet:
我对ASP.NET核心身份验证中间件的设计感到失望。作为一个框架,它应该简化并带来更高的生产率,但这里的情况并非如此 无论如何,一种简单而安全的方法是基于授权过滤器,例如,
IAsyncAuthorizationFilter
。请注意,当MVC选择某个控制器操作并移动到过滤处理时,授权过滤器将在其他中间件之后执行。但是在过滤器中,首先执行授权过滤器()
我只是想评论Clays对Hector答案的评论,但不喜欢Hector的例子抛出异常,没有任何质疑机制,所以这里有一个有效的例子
请记住:
使用Microsoft.AspNetCore.Http;
使用Microsoft.AspNetCore.Identity;
使用Microsoft.AspNetCore.Mvc.Filters;
使用Microsoft.EntityFrameworkCore;
使用制度;
使用System.Linq;
使用System.Security.Claims;
使用系统文本;
使用System.Threading.Tasks;
命名空间BasicAuthFilterDemo
{
公共类BasicAuthenticationFilterAttribute:属性,IAsyncAuthorizationFilter
{
公共字符串领域{get;set;}
公用常量字符串AuthTypeName=“基本”;
私有常量字符串\u authHeaderName=“授权”;
public BasicAuthenticationFilterAttribute(字符串域=null)
{
领域=领域;
}
AuthorizationAsync(AuthorizationFilterContext上下文)上的公共异步任务
{
尝试
{
var request=context?.HttpContext?.request;
var authHeader=request.Headers.Keys.Contains(_authHeaderName)?request.H