asp.Net core 2.2中的多种身份验证方法

Posted

技术标签:

【中文标题】asp.Net core 2.2中的多种身份验证方法【英文标题】:Multiple authentication methods in asp.Net core 2.2 【发布时间】:2019-06-13 02:57:57 【问题描述】:

有没有办法在 .net 核心中使用 JWT 不记名身份验证和自定义身份验证方法?我希望所有操作都默认为 JWT,除了在少数情况下我想使用自定义身份验证标头。

【问题讨论】:

这个问题似乎很简单。你看过文档吗?你能展示一下你到目前为止所做的尝试以及你被困在哪里吗?如果你不确定从哪里开始,你可以在这里查看官方文档:docs.microsoft.com/en-us/aspnet/core/security/authentication/… 【参考方案1】:

我终于想通了。此示例默认使用 JWT 身份验证,在某些极少数情况下使用自定义身份验证。请注意,根据我的阅读,微软似乎不鼓励编写自己的身份验证。请自行承担使用风险。

首先,将此代码添加到 startup.cs 的 ConfigureServices 方法,以确保全局应用身份验证。

services.AddMvc(options => 
    
        var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
        options.Filters.Add(new AuthorizeFilter(policy));
    )

然后,添加此项以配置您希望使用的方案(在我们的示例中为 JWT 和自定义)。

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    // Jwt Authentication
    .AddJwtBearer(options =>
    
        options.Audience = ".......";
        options.Authority = "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_...";
    )
    // Custom auth
    .AddScheme<CustomAuthOptions, 
        CustomAuthHandler>(CustomAuthOptions.DefaultScheme, options =>  );

接下来创建一个类来保存您的自定义身份验证选项:

public class CustomAuthOptions : AuthenticationSchemeOptions

    public const string Scheme = "custom auth";
    public const string CustomAuthType = "custom auth type";

最后,添加一个身份验证处理程序来实现自定义身份验证逻辑。

public class CustomAuthHandler : AuthenticationHandler<CustomAuthOptions>

    public CustomAuthHandler(
        IOptionsMonitor<CustomAuthOptions> options, 
        ILoggerFactory logger, 
        UrlEncoder encoder, 
        ISystemClock clock) : base(options, logger, encoder, clock)
    
    

    protected override Task<AuthenticateResult> HandleAuthenticateAsync()
    
        // Auth logic goes here
        if (!Request.Headers....) 
        
            return Task.FromResult(AuthenticateResult.Fail("Authentication Failed."));
        

        // Create authenticated user
        ClaimsPrincipal principal = .... ;

        List<ClaimsIdentity> identities = 
            new List<ClaimsIdentity> 
                new ClaimsIdentity(CustomAuthOptions.CustomAuthType);

        AuthenticationTicket ticket = 
            new AuthenticationTicket(
                new ClaimsPrincipal(identities), CustomAuthOptions.Scheme);

        return Task.FromResult(AuthenticateResult.Success(ticket));
    

最后,为了将它们结合在一起,为您希望对其使用自定义授权的操作添加一个授权属性。

[HttpGet]
[Authorize(AuthenticationSchemes = CustomAuthOptions.Scheme)]
public HttpResponseMessage Get()

    ....

现在 JWT 身份验证将自动应用于所有操作,并且自定义身份验证将仅添加到 Authorize 属性设置为自定义方案的操作。

我希望这对某人有所帮助。

【讨论】:

例如基本认证:jasonwatmore.com/post/2018/09/08/… 这个 naswer 非常有用:“使用多个 JWT 承载身份验证”***.com/a/49706390/218651

以上是关于asp.Net core 2.2中的多种身份验证方法的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 2.2 中的 Azure AD 身份验证

ASP .NET CORE 2.2 JWT 和声明网站的身份验证

ASP.NET Core 2.2 JWT 身份验证

使用 ASP.NET Core 的应用程序和用户身份验证

JWT 身份验证 ASP.NET Core MVC 应用程序

Asp.Net Core 2.2 - 如何在使用两个 AuthorizationSchemes、JWT 和 cookie 时返回当前用户 ID