Azure active directory 我应该在ActionFilter中测试AdalException吗?
在GitHub上的一些Azure示例中,我们有一个使用ADAL访问受保护的Web API资源的示例。这项工作受到try/catch的保护,try/catch寻找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
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客户端)这种方法有两个问题
@vibronet提出了一个很好的观点——不要为您的WebAPI端点这样做。它们是用bearer auth调用的,不应该自动重定向到登录过程。返回一个401,指示凭据无效,并将其释放 但对于用户交互使用的MVC应用程序来说,这是一个合理的想法,但要受到一些限制
希望这能有所帮助。在我问题的结尾添加了一点背景。。简言之:是的,事实上,我正在处理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);
}
}
}
}