在GitHub like this one上的一些Azure示例中,我们有一个使用ADAL访问受保护的Web API资源的示例。该尝试受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_token'd请求时,我是否真的希望在每个控制器中都进行所有这些try / catch业务?
创建ActionFilter
是否有意义?这个片段的灵感来自我在this Azure Sample
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);
}
}
}
}
我的上下文: 我正在使用一组相当同质的支架MVC控制器,它们在生成时以EntityFramework为中心。但现在需要重新加工以访问我的Web API(通过我的新AutoRest客户端)
答案 0 :(得分:2)
该方法存在两个问题。
答案 1 :(得分:2)
@vibronet提出了一个很好的观点 - 不为您的WebAPI端点做到这一点。他们使用bearer auth进行调用,并且不应自动重定向到登录过程。返回401表示凭据无效并让它继续。
但是对于一个MVC应用程序,用户正在以交互方式使用,这是一个合理的想法,受到一些限制。
希望有所帮助。