我有一个ASP.NET Core MVC应用程序,该应用程序使用Windows身份验证以其AD帐户登录用户。现在,我需要为外部系统添加一个WebAPI组件以与该应用程序交互。但是,WebAPI的使用者需要使用承载令牌进行身份验证。我的想法是将应用程序分为两个区域-WebApp,这是当前的MVC控制器和视图;和WebAPI,它们将成为REST控制器。
是否可以将一个区域配置为使用Windows身份验证(IISDefaults.AuthenticationScheme
),将另一个区域配置为使用承载令牌?
答案 0 :(得分:2)
总有一种方法:)
假设您有一个区域-Area55-带有api控制器-AlienController-
创建自定义控制器模型约定,以便Area55下的任何控制器都将通过 apipolicy
进行授权 public class MyAuthorizeFiltersControllerConvention : IControllerModelConvention
{
public void Apply(ControllerModel controller)
{
string apiArea;
if (controller.RouteValues.Any()
&& controller.RouteValues.TryGetValue("area", out apiArea)
&& apiArea.Equals("Area55"))
{
controller.Filters.Add(new AuthorizeFilter("apipolicy"));
}
else
{
controller.Filters.Add(new AuthorizeFilter("defaultpolicy"));
}
}
}
然后将其注册到startup.cs
services.AddMvc(o =>
{
o.Conventions.Add(new MyAuthorizeFiltersControllerConvention());
});
仍然在您的startup.cs中,配置策略以使用我们想要的身份验证方案
services.AddAuthorization(o =>
{
o.AddPolicy("defaultpolicy", b =>
{
b.RequireAuthenticatedUser();
b.AuthenticationSchemes = new List<string> { IISDefaults.AuthenticationScheme };
});
o.AddPolicy("apipolicy", b =>
{
b.RequireAuthenticatedUser();
b.AuthenticationSchemes = new List<string> { JwtBearerDefaults.AuthenticationScheme };
});
});
控制器可能是这样的
[Area("Area55")]
[Route("[area]/api/[controller]")]
[ApiController]
public class AlienController : ControllerBase
{
}
我猜就是这些。