如何在启用Windows身份验证和匿名身份验证时获取Windows用户名

时间:2018-03-27 23:25:37

标签: asp.net-core-2.0

我已经在核心2.0中首次在.net核心中构建了我的api。客户端使用vs 2017角度模板构建。

我的api甚至被其他可能没有使用Windows身份验证的应用程序使用。对于那些我想允许匿名访问的功能。出于这个原因,我要启用Windows身份验证和匿名身份验证。

但是当启用两者时我知道我无法获得Windows用户名。在这种情况下,如何获取Windows用户名?

当我启用匿名身份验证以及Windows身份验证时,以下代码会中断。

[Route("current")]
public ADUser GetCurrentUser()
{

         string accountUser = this.User.Identity.Name;     
         return new ADUser { Name = accountUser };
}

有人可以帮助我,他们是如何处理以下情况的。如果没有,有人可以告诉我如何在.net core 2.0中执行以下操作

  1. 使用Windows身份验证对用户进行身份验证
  2. 保护api不被恶意用户访问。
  3. 即使是匿名用户也可以使用api的一些基本功能。
  4. 使用Windows身份验证时,我需要能够获取Windows用户名,因此我会检查我的用户,角色数据库以相应地对其进行授权。

    [更新] 正如我所说的,当我启用Windows身份验证并禁用IIS中的所有其他身份验证类型时,我知道我获得了Windows用户名。但我无法访问我希望匿名用户即使在使用[AllowAnonymous]后也能访问的功能。 enter image description here

    我还可以从以下代码段中读取,如果仅启用了Windows身份验证,则AllowAnonymous不会产生任何影响。

    When Windows authentication is enabled and anonymous access is disabled, the [Authorize] and [AllowAnonymous] attributes have no effect. If the IIS site (or HTTP.sys or WebListener server) is configured to disallow anonymous access, the request never reaches your app. For this reason, the [AllowAnonymous] attribute isn't applicable. Thanks

2 个答案:

答案 0 :(得分:2)

以下是我如何解决这个问题:

IIS

由于您希望允许匿名用户访问API的某些端点,因此您需要同时启用匿名身份验证和Windows身份验证。

作为旁注,您正确地说,[AllowAnonymous]仅在启用Windows身份验证时无效,因为位于API前面的IIS将拒绝匿名请求。

ASP.NET核心身份验证

现在启用了匿名身份验证,IIS默认情况下不会尝试对请求进行身份验证,因此无需进一步配置,就ASP.NET Core而言,所有请求都将是匿名的。

答案是向ASP.NET Core表明您希望尝试在每个请求上运行Windows身份验证过程。你可以这样做:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Other code omitted for brievity

        // This sets the IIS authentication scheme as the default scheme
        services.AddAuthentication(IISDefaults.AuthenticationScheme);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        // Other code omitted for brievity

        // This includes the authentication middleware in the request pipeline
        // It will try to authenticate every incoming request
        app.UseAuthentication();

        // MVC comes next, so the authentication will have taken place
        // by the time your controller action is executed against the scheme
        // used in AddAuthentication
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

MVC

现在控制器中有两种可能性:

  • 客户端与Windows身份验证兼容,因此User.Identity.IsAuthenticated将返回true
  • 客户端与Windows身份验证不兼容,因此User.Identity.IsAuthenticated将获取值false

这意味着您可以对需要身份验证的特定操作使用[Authorize]属性,或者将AuthorizeAttribute全局添加到应用程序,并对可以执行的操作使用[AllowAnonymous]匿名打电话。

答案 1 :(得分:1)

  • 将您的应用程序部署到IIS,然后打开该站点的“身份验证”菜单。

enter image description here

  • 禁用匿名并启用Windows身份验证

enter image description here

  • 将以下内容添加到ConfigureServices方法:

    //使用Microsoft.AspNetCore.Server.IISIntegration;

    services.AddAuthentication(IISDefaults.AuthenticationScheme)

  • 对于要保护的API或操作控制器,使用[Authorize]属性装饰它们,然后使用HttpContext.User.Identity.Name获取登录用户。对要允许访问的操作使用[AllowAnonymous]

如果您想要保护并允许访问同一个api,那么您需要提供自己的授权过滤器实现。

有关详细信息,请查看此link