Azure active directory 我应该在ActionFilter中测试AdalException吗?

Azure active directory 我应该在ActionFilter中测试AdalException吗?,azure-active-directory,adal,action-filter,Azure Active Directory,Adal,Action Filter,在GitHub上的一些Azure示例中,我们有一个使用ADAL访问受保护的Web API资源的示例。这项工作受到try/catch的保护,try/catch寻找AdalException 我将代码总结如下: try { //pseudo code... configure a client to use an access token.. var token = ADAL.AcquireTokenAsync... var httpClient = new

在GitHub上的一些Azure示例中,我们有一个使用ADAL访问受保护的Web API资源的示例。这项工作受到try/catch的保护,try/catch寻找AdalException

我将代码总结如下:

 try 
 { 
     //pseudo code...  configure a client to use an access token..
     var token = ADAL.AcquireTokenAsync...
     var httpClient = new HttpClient(baseUri, token);

     // use the token for querying some protected API
     var result = //await HttpClient to return data...

     return View(result); 
 } 
 catch (AdalException) 
 { 
     // do something important with the exception, 
     // e.g. return an error View w/login link
 } 
所以,当我开始充实我的MVC控制器以使用ADAL-access\U令牌请求时,我真的希望每个控制器都有这样的尝试/捕获业务吗

创建
ActionFilter
有意义吗?这段代码的灵感来自我在

我的背景:
我采用了一组相当同质的支架式MVC控制器,这些控制器在生成时以EntityFramework为中心。。但是现在需要重新使用工具来访问我的Web API(通过我新的AutoRest客户端)

这种方法有两个问题

  • 您提到的示例代码和过滤器实现是针对web应用程序的,而不是web API。这是一个重要的区别。Web应用程序可以依靠浏览器与用户交互进行身份验证;web API不知道客户端有什么用户体验(或者即使有任何用户体验),因此错误行为是完全不同的
  • 控制器可能会调用多个API,需要对不同的资源进行多个令牌请求,这些请求可能会独立地失败或成功,并连接到不同的提供者。不同的控制器可能调用不同的资源。对错误的反应可能会有所不同。像您原型化的过滤器这样的过滤器只能在非常有限的情况下使用。 因此,我想说,除非您的控制器都被期望执行非常同质的逻辑,否则像上面这样的过滤器不会给您所需要的灵活性

  • @vibronet提出了一个很好的观点——不要为您的WebAPI端点这样做。它们是用bearer auth调用的,不应该自动重定向到登录过程。返回一个401,指示凭据无效,并将其释放

    但对于用户交互使用的MVC应用程序来说,这是一个合理的想法,但要受到一些限制

  • 确保你的过滤器是非常紧密的匹配。也就是说,确保它只处理您可以合理确定的导致身份验证问题的异常(而不是访问被拒绝的问题)。可能是包装逻辑引发的自定义异常,或者是除此之外的一些额外条件,即ADALException,以确保它是一个可通过再次登录解决的问题
  • 除非您真的希望每个请求都有这样的处理,否则请考虑将其附加到控制器或操作层,而不是全局
  • 注意潜在的“循环”问题,即出现错误时,告诉用户重新登录,获取错误,让他们重新登录,等等。触发登录时,可能会在会话中设置一些数据,或者在登录过程中设置一些数据,或者类似的情况。与其让用户的浏览器陷入无限重定向循环中,不如给出错误消息。(当然,这也适用于手动处理异常情况)

  • 希望这能有所帮助。

    在我问题的结尾添加了一点背景。。简言之:是的,事实上,我正在处理w/MVC控制器。调用多个API的好处。谢谢!!好主意。肯定会做#2,感谢指针。提到的示例不会执行自动重定向,而是修改用户体验,以便向用户提供一个链接来触发身份验证过程。其思想是,无法执行来自给定控制器的呼叫并不一定意味着用户不能对应用程序执行任何其他操作。这种方法的一个很好的例子:klout.com
    public class AdalErrorAttribute : FilterAttribute, IExceptionFilter
    {
        void IExceptionFilter.OnException(ExceptionContext filterContext)
        {
            if(filterContext.Exception is AdalException)
            {
                if (filterContext.RequestContext.HttpContext.Request.QueryString["reauth"] == "True")
                {
                    //
                    // Send an OpenID Connect sign-in request to get a new set of tokens.
                    // If the user still has a valid session with Azure AD, they will not be prompted for their credentials.
                    // The OpenID Connect middleware will return to this controller after the sign-in response has been handled.
                    //
                    filterContext.RequestContext.HttpContext.GetOwinContext().Authentication.Challenge(
                        new AuthenticationProperties(),
                        OpenIdConnectAuthenticationDefaults.AuthenticationType);
                }
            }
        }
    }