使用Windows身份验证的Intranet应用程序是否需要ASP.NET核心身份

时间:2018-04-10 09:10:44

标签: asp.net-core asp.net-identity windows-authentication claims

在Intranet Web应用程序中使用Windows身份验证我想实现以下目标:

  • 从AD(名称,员工编号)
  • 收集其他属性
  • 从数据库表中收集其他属性(工作时间,付费)
  • 基于应用程序角色(不是AD组)进行授权
  • 基于AD属性授权(具有直接报告)
  • 用户未提供用户名/密码

在我搜索答案时,建议我需要将ClaimsTransformation添加到我的应用程序中:

How do I use Windows Authentication with users in database

Populate custom claim from SQL with Windows Authenticated app in .Net Core

Caching Claims in .net core 2.0

虽然我不完全理解解决方案以及为什么ClaimsTransformation在每个请求中都会发生,所以我正在寻找以下答案:

  1. ClaimsTransformation需要ASP.NET核心身份吗?
  2. 只有Windows身份验证或基于表单的身份验证的每个请求都会发生ClaimsTransformation吗?
  3. 这是否必须在每次请求时发生?
  4. 像GivenName这样的缓存声明,Surname看起来很简单,但角色呢?需要采取哪些步骤来确保每次都不会访问数据库,但是当有更改时角色会更新。
  5. 对于我正在尝试做的事情,是否有更简单的替代方案?

1 个答案:

答案 0 :(得分:1)

article给了我一些想法,这是一个可能的解决方案。

控制器将从具有需要Authenticated声明的策略的基本控制器继承。当它不存在时,它将转到AccessDeniedPath并静默执行登录,并添加Authenticated声明以及任何其他声明,如果已存在,则会显示“拒绝访问”消息。< / p>

创建新的ClaimsIdentity时,由于收到HTTP 400 - Bad Request (Request Header too long)错误消息,我必须删除原始身份中的大多数声明。

这种方法有什么明显的问题吗?

<强> Startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(options =>
            {
                options.LoginPath = "/Home/Login";
                options.AccessDeniedPath = "/Home/AccessDenied";
            });

        services.AddAuthorization(options =>
        {
            options.AddPolicy("Authenticated",
                policy => policy.RequireClaim("Authenticated"));
            options.AddPolicy("Admin",
                policy => policy.RequireClaim("Admin"));
        });
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseBrowserLink();
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseStaticFiles();
        app.UseAuthentication();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

<强>控制器

[Authorize(Policy = "Authenticated")]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    [Authorize(Policy = "Admin")]
    public IActionResult About()
    {
        return View();
    }

    [AllowAnonymous]
    public async Task<IActionResult> Login(string returnUrl)
    {
        var identity = ((ClaimsIdentity)HttpContext.User.Identity);

        var claims = new List<Claim>
        {
            new Claim("Authenticated", "True"),
            new Claim(ClaimTypes.Name,
                identity.FindFirst(c => c.Type == ClaimTypes.Name).Value),
            new Claim(ClaimTypes.PrimarySid,
                identity.FindFirst(c => c.Type == ClaimTypes.PrimarySid).Value)
        };

        var claimsIdentity = new ClaimsIdentity(
            claims,
            identity.AuthenticationType,
            identity.NameClaimType,
            identity.RoleClaimType);

        await HttpContext.SignInAsync(
            CookieAuthenticationDefaults.AuthenticationScheme,
            new ClaimsPrincipal(claimsIdentity),
            new AuthenticationProperties());

        return Redirect(returnUrl);
    }

    [AllowAnonymous]
    public IActionResult AccessDenied(string returnUrl)
    {
        if (User.FindFirst("Authenticated") == null)
            return RedirectToAction("Login", new { returnUrl });

        return View();
    }
}