【问题标题】:Is it safe to skip [Authorize] attribute on a particular controller API for optional authorization?跳过特定控制器 API 上的 [Authorize] 属性以进行可选授权是否安全?
【发布时间】:2019-12-15 21:52:13
【问题描述】:

我有一个现有的 ASP.NET Core MVC 应用程序,我想在控制器中添加一个新的 API 方法。我想尽可能少地接触认证/授权代码,所以我不想为这个 API 编写新的认证中间件。

如果用户是匿名/未知的,该方法应该返回某种类型的数据。如果用户已登录并拥有有效用户,它应该返回更具体和潜在的个人信息。

跳过 [Authorize] 属性,只检查用户名的 HttpContext.User (https://docs.microsoft.com/en-us/dotnet/api/system.web.httpcontext.user?view=netframework-4.8) 属性是否安全?

我可以假设签名已经被 OpenID Connect 中间件验证了吗?

// No Authorize attribute
public IActionResult MyApi()
{
    string userName = System.Security.Claims.Claim idClaim = this.HttpContext.User?.Claims?.FirstOrDefault(a => a.Type == "sub")?.Value;
    // Can I assume that the User object only is non-null if the OAuth signature is actually verified?
    // Or is fake-cookies possible?
}

【问题讨论】:

  • 如果您希望匿名用户访问 API,那么只需使用 HttpContext.User.Identity.IsAuthenticated。就是大家的意思!但是,如果您需要不同类型的经过身份验证的用户收到不同类型的响应,那么我认为您应该使用策略。

标签: c# asp.net-core model-view-controller asp.net-core-mvc authorization


【解决方案1】:

授权对身份验证没有任何作用,它只是一种检查经过身份验证的用户是否有权访问所请求资源的机制。它就像是身份验证之上的一层。

HttpContext.User 的存在不一定表示已通过身份验证的用户,但HttpContext.User.Identity.IsAuthenticated 确实如此。对于ClaimsIdentity,它基本上只是检查字段AuthenticationType 是否不为空。

因此,如果用户设置了AuthenticationType 字段,则可以安全地假设用户已通过身份验证。假设Name 字段不为空,因为未经身份验证的用户无法设置它也是安全的。

【讨论】:

    【解决方案2】:

    我使用自定义扩展方法从当前身份读取用户名:

    public static bool TryGetUserName(this IIdentity identity, out string username)
    {
        try
        {
            username = Microsoft.AspNet.Identity.IdentityExtensions.GetUserName(identity);
            return true;
        }
        catch (ArgumentNullException ane)
        {
            username = null;
            return false;
        }
    }
    

    我通过调用在我的 API 方法中使用此扩展:

    bool isAuth = this.User?.Identity?.TryGetUserName(out username) ?? false;
    

    【讨论】:

    • 感谢您的输入!我对此有一个扩展方法,但为了简化这个问题,我从中复制了代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多