2017-07-17 108 views
2

在GitHub like this one上的一些Azure示例中,我们有一个使用ADAL访问受保护的Web API资源的示例。该工作是由一个try/catch寻找一个AdalException我应该在ActionFilter中测试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_TOKEN” d要求,我是否真的想要在每个控制器中进行这种尝试/捕捉业务?

创建一个ActionFilter是否有意义?这段代码是由代码的启发,我看到在this Azure Sample

​​

我的上下文: 我以一个相当均匀的一套脚手架MVC控制器,是在生成它们时的EntityFramework为中心的..但现在需要重新设置以访问我的Web API(通过我的新AutoRest客户端)

回答

2

@vibronet提出了一个很好的观点 - 不要为您的WebAPI端点做到了这一点。他们被称为持证人身份验证,不应该自动重定向到登录过程。回复401表示证书无效并放行。

但是对于用户正在交互使用的MVC应用程序,这是一个合理的想法,需要遵循一些约束条件。

  1. 请确保您的过滤器对于匹配的内容非常紧张。 IE浏览器。确保它只有可以合理地处理异常,当然可以引起认证问题(相对于拒绝访问的问题)。也许是由包装逻辑引发的自定义异常,或者超出它的一些额外条件是ADALException,以确保它是通过再次登录可解决的问题。
  2. 除非你真的想要请求有这个处理,看看附加在控制器或行动层而不是全局。
  3. 注意潜在的“循环”问题,在那里出现错误,告诉用户再次登录,获取错误,再次登录等等。当触发登录时,可能会在会话中设置一些数据,或在登录过程中,或类似的东西。最好提供一个错误信息,而不是让用户的浏览器停留在无限重定向循环中。 (当然,这也适用于手动处理异常的情况)

希望有所帮助。

+0

好想法。肯定会做#2,谢谢你的指点。 – bkwdesign

+0

提到的示例不会执行自动重定向 - 而是它们会修改UX,以便为用户提供链接来触发身份验证过程。这个想法是,无法从给定的控制器执行调用并不一定意味着用户不能对应用程序执行任何其他操作。这种方法的一个很好的例子:klout.com – vibronet

2

该方法有两个问题。

  1. 您提到的示例代码和过滤器实现用于web应用程序,而不是web API。这是一个重要的区别。 Web应用程序可以依靠浏览器与用户进行交互以进行身份​​验证; Web API不知道客户端具有何种UX(或者甚至根本不存在任何UX),因此错误行为与根本不同
  2. 控制器可能调用多个API,需要针对不同资源的多个令牌请求 - 这可能会失败或独立成功,并连接到不同的提供者。不同的控制器会调用不同的资源对错误的反应可能会有所不同。一个过滤器,例如你原型的过滤器,只能帮助一些非常狭窄的案例。 因此,我会说,除非你的控制器都被期望执行非常均匀的逻辑,否则像上面这样的过滤器不会给你所需的灵活性。
+0

添加了一些上下文到我的问题结束..总之:是的,的确,我正在处理w/MVC控制器。关于调用多个API的好处。谢谢!! – bkwdesign

相关问题