【发布时间】:2020-11-20 14:09:48
【问题描述】:
我有一个使用 ASP.NET (.NET Framework 4.8) 和 ASP.NET WEB API 2、SQL SERVER 2016 开发的 Web 应用程序。我正在使用带有 OpenIDConnect(授权代码流)的 Azure AD。
在这种情况下,只有一个主机名为https://www.testwebapp.com的网络应用注册
我遵循https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow 中提到的所有步骤并实施了 Azure AD 身份验证。这是应用程序的详细信息:
主机:https://www.testwebapp.com API端点:https://www.testwebapp.com/services/api/test/current
导航到 URL:https://www.testwebapp.com 我被重定向到 Azure AD 登录页面,我在其中提供凭据,并且可以使用 jwt.io 查看声明。现在对 WEB API 项目的任何调用都来自 AngularJS 应用程序,这会导致授权失败。
在调试时,我可以看到上下文对象没有声明,因此也没有主体。
这里是在 API 项目的 WebApiConfig.cs 文件中注册的身份验证和授权文件管理器。
WebApiConfig.cs:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
config.Filters.Add(new SampleAuthenticationAttribute());
config.Filters.Add(new SampleAuthorizationAttribute());
}
}
SampleAuthenticationAttribute.cs:
public class SampleAuthenticationAttribute : ActionFilterAttribute, IAuthenticationFilter
{
private HttpAuthenticationContext _context;
public Task AuthenticateAsync(HttpAuthenticationContext context, System.Threading.CancellationToken cancellationToken)
{
_context = context;
return Task.FromResult(0);
}
public Task ChallengeAsync(HttpAuthenticationChallengeContext context, System.Threading.CancellationToken cancellationToken)
{
return Task.FromResult(context.Result);
}
}
SampleAuthorizationAttribute.cs:
public class SampleAuthorizationAttribute : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext actionContext)
{
// retrieve principal and check authZ
IPrincipal principal;
if (!SecurityHelper.IsSecurityDisabled)
principal = actionContext.RequestContext.Principal as IClaimsPrincipal;
else
principal = actionContext.RequestContext.Principal as System.Security.Claims.ClaimsPrincipal;
if (principal != null && principal.Identity != null && principal.Identity.IsAuthenticated)
return true;
else
return false;
}
protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{
var response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "unauthorized");
response.Headers.WwwAuthenticate.Add(new AuthenticationHeaderValue("Federation", "permission required."));
actionContext.Response = response;
}
}
以下是 Web 应用程序的整体架构:
任何人都可以通过提供进一步的指导来帮助我吗?
【问题讨论】:
标签: asp.net angularjs azure-active-directory msal .net-framework-4.8