是否可以针对多个身份验证提供程序保护 ASP.NET Web API 2 应用程序

本文关键字:NET ASP 程序保护 Web API 应用程序 身份验证 是否 | 更新日期: 2023-09-27 17:57:08

我刚刚完成了这篇关于使用 OAuth2 保护 ASP.NET Web API 2 应用程序免受使用 ADAL 和 OWIN 中间件组件的 ADFS/Windows Azure AD 实例的出色文章。

但是,本文中描述的整个身份验证工作流似乎非常"硬连线"到 HTTP 请求管道中,并且没有为针对其他身份验证提供程序实现身份验证工作流留下任何空间。

为什么需要这样做?

我有一个移动 Web 客户端,其中允许"内部"和"外部"用户进行身份验证,以便针对 API 端点发出用户相关数据的请求。

当"内部"用户从 Azure AD/ADFS 获取其身份验证令牌时,"外部"用户必须针对颁发另一种身份验证令牌的另一个系统进行身份验证。

因此,我必须能够在 API 端点级别区分来自"内部"和"外部"用户的请求,以便为其不同的身份验证令牌启动正确的评估工作流。

关于

如何实现这一目标的任何指示将不胜感激。

问候,马蒂亚斯

是否可以针对多个身份验证提供程序保护 ASP.NET Web API 2 应用程序

经过一番挖掘,我找到了以下答案,该答案描述了如何使用 JwtSecurityTokenHandler 类以编程方式验证由 ADFS OAuth 2.0 身份验证流颁发的基于 JWT 的身份验证令牌。 代码示例可以在链接的答案中找到。

这将允许我创建自定义授权筛选器,然后我可以将其用作控制器或控制器方法的属性。此筛选器将分析客户端请求中的授权标头,检测其中包含的身份验证令牌的类型,然后启动相应的程序逻辑以验证/验证身份验证令牌。

类似这些内容可能是:

public enum AuthTokenType
{
    OAuth2Bearer,
    Custom
}
public class CustomAuthenticationAttribute : IAuthenticationFilter
{
    public bool AllowMultiple
    {
        get
        {
            throw new NotImplementedException();
        }
    }
    public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
    {
            HttpRequestMessage incommingRequest = context.Request;
            HttpHeaders headers = incommingRequest.Headers;
            string authHeader = GetHeader(headers, "Authorization");
            AuthTokenType authTokenType = DetecteAuthTokenType(authHeader);
            if (authTokenType == AuthTokenType.OAuth2Bearer) 
            {
               // Validate auth token using the JwtSecurityTokenHandler class
            }
            else if (authTokenType == AuthTokenType.Custom)
            {
               // Validate auth token using whatever is necessary
            }
            else
            {
               // auth token doesn't correspond to a recognized type or hasn't been part of the client request - reject request
            }  
    }
    public AuthTokenType DetectAuthTokenType(string authHeader)
    {
       // Analyze the authorization header string and return its proper type
    }
    private string GetHeader(HttpHeaders headers, string key)
    {
        IEnumerable<string> keys = null;
        if (!headers.TryGetValues(key, out keys))
            return null;
        return keys.First();
    }
}