Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 跳过特定控制器API上的[Authorize]属性进行可选授权是否安全?_C#_Asp.net Core_Model View Controller_Asp.net Core Mvc_Authorization - Fatal编程技术网

C# 跳过特定控制器API上的[Authorize]属性进行可选授权是否安全?

C# 跳过特定控制器API上的[Authorize]属性进行可选授权是否安全?,c#,asp.net-core,model-view-controller,asp.net-core-mvc,authorization,C#,Asp.net Core,Model View Controller,Asp.net Core Mvc,Authorization,我有一个现有的ASP.NET核心MVC应用程序,我想在控制器中添加一个新的API方法。我希望尽可能少地接触身份验证/授权代码,因此我不想为这个API编写新的身份验证中间件 如果用户不知名/未知,则该方法应返回某种类型的数据。如果用户已登录并且拥有有效的用户,则它应该返回更具体的潜在个人信息 跳过[Authorize]属性,只检查用户名的HttpContext.User()属性是否安全 我可以假设签名已经被OpenID连接中间件验证了吗 //没有授权属性 公共IActionResult MyApi

我有一个现有的ASP.NET核心MVC应用程序,我想在控制器中添加一个新的API方法。我希望尽可能少地接触身份验证/授权代码,因此我不想为这个API编写新的身份验证中间件

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

跳过[Authorize]属性,只检查用户名的HttpContext.User()属性是否安全

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

//没有授权属性
公共IActionResult MyApi()
{
字符串userName=System.Security.Claims.Claim idClaim=this.HttpContext.User?.Claims?.FirstOrDefault(a=>a.Type==“sub”)?.Value;
//如果实际验证了OAuth签名,是否可以假定用户对象仅为非null?
//还是可能有假饼干?
}

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

出现
HttpContext.User
不一定表示已验证的用户,但
HttpContext.User.Identity.IsAuthenticated
表示已验证的用户。对于
ClaimsIdentity
它基本上只是检查字段
AuthenticationType
是否为空


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

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

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;

如果您希望匿名用户访问API,那么只需使用
HttpContext.User.Identity.IsAuthenticated
。那是指所有人!但是,如果您需要不同类型的经过身份验证的用户接收不同类型的响应,那么我认为您应该使用策略。谢谢您的输入!我对此有一个扩展方法,但为了简化这个问题,我从中复制了代码。