C# 跳过特定控制器API上的[Authorize]属性进行可选授权是否安全?
我有一个现有的ASP.NET核心MVC应用程序,我想在控制器中添加一个新的API方法。我希望尽可能少地接触身份验证/授权代码,因此我不想为这个API编写新的身份验证中间件 如果用户不知名/未知,则该方法应返回某种类型的数据。如果用户已登录并且拥有有效的用户,则它应该返回更具体的潜在个人信息 跳过[Authorize]属性,只检查用户名的HttpContext.User()属性是否安全 我可以假设签名已经被OpenID连接中间件验证了吗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
//没有授权属性
公共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
。那是指所有人!但是,如果您需要不同类型的经过身份验证的用户接收不同类型的响应,那么我认为您应该使用策略。谢谢您的输入!我对此有一个扩展方法,但为了简化这个问题,我从中复制了代码。