gpt4 book ai didi

c# - Windows 身份验证 - 特殊用户需要额外的密码

转载 作者:可可西里 更新时间:2023-11-01 08:29:02 26 4
gpt4 key购买 nike

我正在开发一个内联网 asp.net 核心 web api 应用程序。身份验证的要求是:

  • REQ1 - 当试图访问该网站的用户不在 Active Directory 的特殊组(我们将其命名为“commonUsers”)时,它根本没有被授权
  • REQ2 - 当试图访问该网站的用户在 Active Directory 的“commonUsers”组中时获得授权并返回网络资源
  • REQ3 - 当试图访问该网站的用户在 Active Directory 的“superUser”组中时,需要再次提示他输入他的域密码(因为它试图访问一些非常受限的资源)

现在,我到目前为止所拥有的:

  • 我的服务是使用 http.sys 服务器托管的,以支持 Windows 身份验证。
  • 我正在使用 claims transformer middlewere 来检查用户的 Active Directory 组,让我们这样说:

    public class ClaimsTransformer : IClaimsTransformation {
    private readonly IAuthorizationService _authorizationService;
    public ClaimsTransformer(IAuthorizationService authorizationService)
    {
    _authorizationService = authorizationService;
    }

    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
    _authorizationService.Authorize(principal as IHmiClaimsPrincipal);
    return Task.FromResult(principal);
    }}
  • 我也在我的服务配置中指定了一个特殊的策略,例如:

    services.AddAuthorization(options =>    {        options.AddPolicy("TestPolicy", policy =>                                    policy.RequireClaim(ClaimTypes.Role, "TestUser"));        options.AddPolicy("TestPolicy2", policy =>                                    policy.RequireClaim(ClaimTypes.Role, "SuperUser"));    });
  • 我将 [Authorize] 属性与特定策略一起使用,以便根据策略限制对特定资源的访问

现在的问题是,我应该如何满足REQ3?

最佳答案

我想我会尝试使用 MVC 过滤器:https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-2.2#authorization-filters

过滤器在所有中间件之后运行,但在操作之前运行。这将允许您控制仅针对特定操作或 Controller 重定向到凭据页面。虽然通常这不是推荐的授权方法,但我认为它符合您对混合辅助身份验证的要求。

public class SuperUserFilter : Attribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
if (context.HttpContext.Request.Cookies.TryGetValue("SuperUserCookie", out string cookieVal))
{
if (!IsValidCookie(cookieVal))
context.Result = LoginPage(context);

}
else
{
context.Result = LoginPage(context);
}
}

private bool IsValidCookie(string cookieVal)
{
//validate cookie value somehow
// crytpographic hash, store value in session, whatever
return true;
}

private ActionResult LoginPage(AuthorizationFilterContext context)
{
return new RedirectToActionResult("SuperUser", "Login",
new {redirectUrl = context.HttpContext.Request.GetEncodedUrl()});
}
}

然后你创建一个登录 Controller

public class LoginController : Controller
{
[HttpGet]
public IActionResult SuperUser(string redirectUrl)
{
// return a page to enter credentials
// Include redirectUrl as field
}

[HttpPost]
public IActionResult SuperUser(LoginData loginData)
{
// Validate User & Password
Response.Cookies.Append("SuperUserCookie", "SomeValue");
return Redirect(loginData.RedirectUrl);
}
}

然后你可以根据需要装饰特定的 Action (或 Controller ):

public class MyController : Controller
{
[HttpGet]
[SuperUserFilter]
public IActionResult MySensitiveAction()
{
// Do something sensitive
}
}

关于c# - Windows 身份验证 - 特殊用户需要额外的密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56010586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com