Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core ASP.NET内核中的基本身份验证_Asp.net Core_Basic Authentication_Asp.net Core Mvc_Asp.net Core 1.0 - Fatal编程技术网

Asp.net core ASP.NET内核中的基本身份验证

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为内部服务实现的摘要

问题

如何在ASP.NET核心web应用程序中使用自定义成员身份实现基本身份验证

注释

  • 在MVC5中,我使用了本文中的说明,其中要求在
    WebConfig
    中添加一个模块

  • 我仍然在
    IIS
    上部署新的
    MVC核心
    应用程序,但这种方法似乎不起作用

  • 我也不想使用IIS内置支持进行基本身份验证,因为它使用Windows凭据


ASP.NET安全性将不包括基本身份验证中间件,因为它可能存在不安全和性能问题


如果出于测试目的需要基本身份验证中间件,请查看我们通过使用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的例子抛出异常,没有任何质疑机制,所以这里有一个有效的例子

请记住:

  • 生产中没有HTTPS的基本身份验证非常糟糕。确保您的HTTPS设置已加强(例如,禁用所有SSL和TLS<1.2等)
  • 如今,基本身份验证的大多数用法是在公开受API密钥保护的API时使用的(请参见Stripe.NET、Mailchimp等)。使curl友好的api与服务器上的HTTPS设置一样安全
  • 记住这一点,不要购买任何关于基本认证的FUD。跳过像基本身份验证这样基本的东西,是一种意见高而实质低的做法。你可以在评论中看到这种设计的挫折感

    使用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