如何在没有Authorize属性的情况下获取ASP Core 2方法中的用户声明?

时间:2018-01-25 23:30:14

标签: c# asp.net asp.net-core .net-core asp.net-authorization

我有一个可以匿名访问的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();
    }

3 个答案:

答案 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]