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

时间:2016-07-15 09:45:07

标签: c# azure authentication asp.net-web-api2 adal

关于使用ADAL和OWIN中间件组件针对ADFS / Windows Azure AD实例保护使用OAuth2的ASP.NET Web API 2应用程序,我刚刚完成了this excellent article

然而,似乎本文中描述的整个身份验证工作流程非常“硬连线”#34;进入HTTP请求管道,并没有留下任何空间来实现与其他身份验证提供程序的身份验证工作流。

为什么需要这个?

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

虽然"内部"用户从Azure AD / ADFS获取其身份验证令牌" external"用户必须对另一个发布另一种身份验证令牌的系统进行身份验证。

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

如何实现这一目标的任何迹象都将受到高度赞赏。

问候,马蒂亚斯

1 个答案:

答案 0 :(得分:0)

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

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

沿着这些方向的东西可能是:

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();
    }
}