如何强制 MVC 应用程序在启用 Windows 身份验证的情况下请求凭据



我正在开发一个应用程序,该应用程序从另一个应用程序的API中检索一些数据并将其显示在表中。我已经设置了 Windows 身份验证(基于某个 AD 组中的成员身份(并且它可以工作,但我想让它在尝试访问所需页面时始终要求用户提供凭据。我该怎么做?

我是 ASP.NET 的初学者,所以我没有想出任何可以尝试的东西,我已经做了一些谷歌搜索,但没有找到任何相关的东西。当我以为我这样做时,它真的很古老,不再适用了。

这是我的appsettings.json:

"SecuritySettings": {
"ADGroup": "ad\GSRLB2P_ISP_ITSD_INFRA_VST" }

控制器:

public class DeviceController : Controller
{
[Authorize(Policy = "ADRoleOnly")]
public IActionResult Index(string sortOrder, string searchString)
...

启动:

public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
//services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddAuthorization(options =>
{
options.AddPolicy("ADRoleOnly", policy => policy.RequireRole(Configuration["SecuritySettings:ADGroup"]));
});
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});
}

我知道身份验证有效,因为当我将组名称更改为其他名称时,它不允许我访问该页面。但无论如何,我希望该页面要求提供凭据。 可能吗?

您可以使用return HttpUnauthorized()在用户首次访问该页面时发送 HTTP 401 响应。

Windows 身份验证的工作方式如下:

  1. 浏览器请求该页面。
  2. 服务器发回 401 响应,指示它接受"协商"身份验证。
  3. 如果站点受信任,浏览器将使用用户凭据重新发送请求。

如果服务器随后发送另一个401,则浏览器将提示输入新凭据。

如果这样做,则应启用会话并在会话中存储一个标志,表示您已经发送了 401,以便下次可以让他们进入。像这样:

[Authorize(Policy = "ADRoleOnly")]
public IActionResult Index(string sortOrder, string searchString) {
if (!HttpContext.Session.Keys.Contains("Sent401")) {
HttpContext.Session.SetString("Sent401", "yes");
return HttpUnauthorized();
}
...
}

您可以为控制器方法尝试类似的东西:

public ActionResult Index()
{
...
return new HttpUnauthorizedResult();   // force a login prompt
}

这将导致浏览器在页面加载时抛出登录提示。 正如这里的另一个答案所说,您还需要在返回该结果之前设置某种条件,例如检查当前用户是否已通过身份验证;否则,上面的代码只会反复提示用户。

<system.web>
<identity impersonate="true"/>
<authentication mode="Windows"></authentication>
</system.web>

最新更新