【问题标题】:How to redirect unauthenticated user to a page without credential prompt如何将未经身份验证的用户重定向到没有凭据提示的页面
【发布时间】:2020-11-07 14:44:21
【问题描述】:

我的本​​地 ASP.Net Core 3.1 Web 应用程序部署在 IIS 上,并且仅启用了 Windows 身份验证。

如何在不弹出凭据提示的情况下将未经身份验证的用户重定向到视图?例如。转到 PublicIndex 不提示用户输入登录详细信息。这可能吗?

我是否需要实现自定义属性/过滤器来拦截如下请求,或者我可以在 Startup.cs 中进行某种路由配置?

// Private page for authenticated users
[RedirectToPublicIndexIfNotAuthenticated]
public async Task<IActionResult> AuthenticatedIndex()
{
    return View();
}

// Public page for anonymous users
public async Task<IActionResult> PublicIndex()
{
    return View();
}

【问题讨论】:

  • 我不认为你可以。就此而言,基本身份验证非常不安全。你想要的是单点登录。您将需要一些 SAML 构造来实现该 f.i.使用 ADFS。
  • 未能通过 IIS 端 Windows 身份验证的用户会收到 401.1 错误页面的响应。您可以在 IIS 上对其进行自定义以重定向到您喜欢的页面。

标签: c# asp.net-core iis asp.net-core-3.1


【解决方案1】:

在这种情况下,您有两种不同的方法; 但是第一个解决方案是将 option.LoginPath 值更改为您希望未经授权的操作用户被重定向 - 位于 StartUp.cs 中的 services.AddAuthentication() 方法中 - 这不是一个好主意(因为它可能会给您的 Login 带来一些问题 行动)。

因此我强烈建议您按照以下步骤使用第二种解决方案...

您必须使用 Claims 规范来登录您的用户,因此每当授权用户试图进入您的操作时,您已经保存了他的用户名、电子邮件或这些信息。这是一个在登录时使用Claims保存用户帐户信息的示例...

var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, user.Username),
            new Claim(ClaimTypes.Email, user.Email)
        };

如您所见,我们可以随时访问授权用户的用户名,使用User.Identity.Name 变量。但是如果用户没有被授权,它会给我们一个空值。

通过使用这个技巧,你可以控制和重定向你的用户在你想要的每一个操作中

// Private page for authorized users
[Authorized]
public IActionResult AuthenticatedIndex()
{
    #region Conditions
    
    if (User.Identity.Name == null)
    {
        return RedirectToAction("PublicIndex", "Home", new { area = "" });
    }

    #endregion

    return View();
}

// Public page for anonymous users
public IActionResult PublicIndex()
{
    return View();
}

希望有用, 祝你好运!

【讨论】:

    猜你喜欢
    • 2021-09-29
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2017-04-07
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多