我有一个可以匿名访问的API方法。我想使用资源授权来确定用户是否具有访问权限。如果对象是“公共”的,那么任何人(包括匿名用户)都可以访问它。如果对象是“私有”,则只能由登录用户查看。如果我在方法上有一个authorize属性,那么这个逻辑工作正常,但如果没有,用户即使登录也没有声明。
有没有办法在没有授权属性的方法中获取用户的声明?
方法如下:
[HttpGet]
[Route("name/{name}")]
public async Task<IActionResult> Get(string name)
{
var activity = Repo.GetCommandLineActivity(name);
if (activity == null)
{
return NotFound();
}
var isAuthed = await _authService.AuthorizeAsync(User, activity, new ViewIPublicPrivateRequirement());
if (isAuthed.Succeeded)
{
return Ok(activity);
}
return Unauthorized();
}
答案 0 :(得分:1)
解决方案实际上非常简单,添加[Authorize]
和 public class BindableSKCanvasView : SKCanvasView
{
public static readonly BindableProperty ColorProperty =
BindableProperty.Create("Color", typeof(SKColor), typeof(BindableSKCanvasView),defaultValue:SKColors.Black, defaultBindingMode: BindingMode.TwoWay, propertyChanged: RedrawCanvas);
public SKColor Color
{
get => (SKColor)GetValue(ColorProperty);
set => SetValue(ColorProperty, value);
}
private static void RedrawCanvas(BindableObject bindable, object oldvalue, object newvalue)
{
BindableSKCanvasView bindableCanvas = bindable as BindableSKCanvasView;
bindableCanvas.InvalidateSurface();
}
}
就可以了。
答案 1 :(得分:0)
简短回答 - 你不能。
如果你仔细检查,你会看到,当你拥有Authorize
属性时,User对象的类型为ClaimsPrincipal
,当你没有它时 - 它的类型为{ {1}}。
但您可以随时添加自定义WindowsPrincipal
属性或Custom policy-based authorization,并检查用户的声明并执行您的操作。
答案 2 :(得分:0)
即使没有ClaimsPrincipal
属性,也可以检索[Authorize]
,但它确实感觉像是黑客,我不推荐它。如果我是你,我会创建两个不同的端点,一个用于公共访问,另一个用于经过身份验证的用户。
话虽如此,检索ClaimsPrincipal
的方法是调用AuthenticateAsync
方法。请注意,此代码适用于ASP.NET Core 2.0,它与1.1略有不同。
以下是修改过的方法:
[HttpGet("name/{name}")]
[AllowAnonymous]
public async Task<IActionResult> Get(string name)
{
var activity = Repo.GetCommandLineActivity(name);
if (activity == null)
{
return NotFound();
}
// based on the way your authentication is configured in services.AddAuthentication(),
// this can be omitted (in which case, the default authenticate scheme will be used)
var authenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme;
var auth = await HttpContext.AuthenticateAsync(authenticationScheme);
if (auth.Succeeded)
{
// CAUTION: HttpContext.User will STILL be null
var user = auth.Principal;
return Ok(activity);
}
return Unauthorized();
}
警告:如果省略HttpContext.User
属性(或者指定了[Authorize]
,则不会设置[AllowAnonymous]
。