我在Azure中运行了一个使用Azure AD保护的WebAPI实例。移动应用使用承载令牌连接到此API,效果很好。但是,当我尝试从浏览器调用API时,它返回401,因为我没有登录。这是真的,因为我没有出现登录屏幕。
我的API没有任何UI,所以我希望它做的是将用户转发到Azure AD登录并返回到身份验证后调用的API端点。
如果我转到Azure门户网站,则会显示“请求未获得授权时要采取的操作”设置。如果我将其设置为“使用Azure Active Directory登录”,它的行为方式与我想要的一样。但是......我有一些需要匿名访问的端点,此设置捕获所有请求,而不关心任何[AllowAnonymous]属性。
因此,对标记为“授权”但未授权的端点的任何请求都应转发到Azure AD登录,其他所有请求都应被允许。
答案 0 :(得分:1)
将DelegatingHandler
添加到您的web api项目并在WebApiConfig.cs中注册:
config.MessageHandlers.Add(new UnAuthorizedDelegatehandler());
public class UnAuthorizedDelegatehandler: DelegatingHandler
在那里,您可以检查401状态代码并重定向到任何内容,并将重定向网址应用为查询字符串参数。
HttpResponseMessage rm = await base.SendAsync(request, cancellationToken);
if (rm.StatusCode == HttpStatusCode.Unauthorized)
{
// configure the redirect here
return rm;
}