ASP.NET Core中特定于区域的身份验证方案

时间:2019-01-24 18:55:47

标签: asp.net-core asp.net-core-mvc asp.net-core-webapi

我有一个ASP.NET Core MVC应用程序,该应用程序使用Windows身份验证以其AD帐户登录用户。现在,我需要为外部系统添加一个WebAPI组件以与该应用程序交互。但是,WebAPI的使用者需要使用承载令牌进行身份验证。我的想法是将应用程序分为两个区域-WebApp,这是当前的MVC控制器和视图;和WebAPI,它们将成为REST控制器。

是否可以将一个区域配置为使用Windows身份验证(IISDefaults.AuthenticationScheme),将另一个区域配置为使用承载令牌?

1 个答案:

答案 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
    {
    }

我猜就是这些。