当前位置: 首页 > 知识库问答 >
问题:

ASP.NET Core 2.0身份验证中间件

汝墨一
2023-03-14
    null

这在2.0中可以使用,但如果令牌无效(上面的步骤2)并且声明从未添加,我会得到“no authenticationScheme was specified,and there was no DefaultChallengeScheme found”。

所以现在我读到了2.0版本中身份验证的改变:

https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity2x

共有1个答案

谈炳
2023-03-14

所以,经过一整天的努力解决这个问题,我终于弄明白了微软希望我们如何在Core2.0中为他们新的单中间件设置定制身份验证处理程序

在查看了MSDN上的一些文档之后,我发现了一个名为authenticationhandler 的类,它实现了iauthenticationhandler接口。

在那里,我找到了包含现有身份验证方案的完整代码库,位于https://github.com/aspnet/security

JWTBearerHandler类(它扩展了AuthenticationHandler<>)中,任务 HandleAuthenticateAsync() 有一个重写

我添加了旧的中间件,用于通过自定义令牌服务器设置声明,但仍然遇到了一些权限问题,当令牌无效且未设置声明时,只会发出200 OK而不是401 unauthorized

我意识到我已经覆盖了任务HandleChallengeAsync(AuthenticationProperties属性),无论出于何种原因,该任务都用于通过控制器中的[authorize(roles=“”)]设置权限。

删除此重写后,代码已经工作,并且在权限不匹配时成功抛出401

这样做的主要好处是,现在您不能使用自定义中间件,必须通过AuthenticationHandler<>实现它,并且在使用Services.AddAuthentication(...)时必须设置DefaultAuthenticatesChemeDefaultChallengesCheme

下面是一个示例,说明这一切应该是什么样子的:

在startup.cs/configureReservices()中添加:

services.AddAuthentication(options =>
{
    // the scheme name has to match the value we're going to use in AuthenticationBuilder.AddScheme(...)
    options.DefaultAuthenticateScheme = "Custom Scheme";
    options.DefaultChallengeScheme = "Custom Scheme";
})
.AddCustomAuth(o => { });

在startup.cs/Configure()中添加:

app.UseAuthentication();
public static class CustomAuthExtensions
{
    public static AuthenticationBuilder AddCustomAuth(this AuthenticationBuilder builder, Action<CustomAuthOptions> configureOptions)
    {
        return builder.AddScheme<CustomAuthOptions, CustomAuthHandler>("Custom Scheme", "Custom Auth", configureOptions);
    }
}
public class CustomAuthOptions: AuthenticationSchemeOptions
{
    public CustomAuthOptions()
    {

    }
}
internal class CustomAuthHandler : AuthenticationHandler<CustomAuthOptions>
{
    public CustomAuthHandler(IOptionsMonitor<CustomAuthOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
    {
        // store custom services here...
    }
    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // build the claims and put them in "Context"; you need to import the Microsoft.AspNetCore.Authentication package
        return AuthenticateResult.NoResult();
    }
}
 类似资料:
  • 本文向大家介绍asp.net mvc中Forms身份验证身份验证流程,包括了asp.net mvc中Forms身份验证身份验证流程的使用技巧和注意事项,需要的朋友参考一下 验证流程 一、用户登录 1、验证表单:ModelState.IsValid 2、验证用户名和密码:通过查询数据库验证 3、如果用户名和密码正确,则在客户端保存Cookie以保存用户登录状态:SetAuthCookie     1

  • 身份验证 PDF版下载 企业应用中的URL链接可以通过OAuth2.0验证接口来获取员工的身份信息。 通过此接口获取员工身份会有一定的时间开销。对于频繁获取员工身份的场景,建议采用如下方案: 企业应用中的URL链接直接填写企业自己的页面地址; 员工跳转到企业页面时,企业校验是否有代表员工身份的cookie,此cookie由企业生成; 如果没有获取到cookie,重定向到OAuth验证链接,获取员工

  • 我想构建一个API路由,经过身份验证的用户和未经身份验证的用户都可以调用该路由,并根据用户是否经过身份验证返回数据。 我卡在使用身份验证::检查()。 控制器的功能是这样的: 我最后有两个场景: 情景1 在这种情况下,在控制器中,当我检查Auth::check()在if条件内时,无论用户是否经过身份验证,我总是得到错误条件。 方案 2 在这种情况下,在控制器中,当我检查Auth::check()时

  • 问题内容: 我正在尝试在Node.js中使用Socket.IO,并试图允许服务器为每个Socket.IO客户端赋予一个身份。由于套接字代码不在http服务器代码的范围内,因此无法轻松访问已发送的请求信息,因此我假设在连接期间需要将其发送出去。什么是最好的方法 1)将有关谁通过Socket.IO连接到服务器的信息 2)验证他们说的是谁(如果正在使事情变得更容易,我目前正在使用Express) 问题答

  • 我试图使用swift代码在网站上找到这里,但响应是html代码与两个错误:“您必须输入密码!”和“您必须输入用户名!”我是NSURLSession的新手,试图更改用于身份验证的字符串,但无法更改响应。下面是我的代码: 这是控制台响应中的内容:

  • 我正在开发一个具有自己的身份验证和授权机制的REST应用程序。我想使用JSON Web Tokens进行身份验证。以下是有效且安全的实现吗? < li >将开发一个REST API来接受用户名和密码并进行认证。要使用的HTTP方法是POST,因此没有缓存。此外,在传输时还会有安全SSL < li >在认证时,将创建两个JWTs访问令牌和刷新令牌。刷新令牌将具有更长的有效期。这两个令牌都将写入coo