MVC5声明Authorize属性的版本

Eig*_*ite 75 asp.net-mvc claims asp.net-mvc-5

我正在使用MVC5和新的OWIN认证中间件尝试VS2013 RC中的一些新功能.

所以,我习惯使用[Authorize]属性来限制角色的操作,但我正在尝试使用基于声明/活动的授权,而我找不到它的等效属性.

有一个明显的我错过了或者我需要自己动手吗?我有点希望有一个开箱即用.

我正在寻找的具体是[Authorize("ClaimType","ClaimValue")]我想的.

提前致谢.

Eig*_*ite 70

我最后只是写了一个简单的属性来处理它.如果没有一堆额外的配置,我就无法在框架中找到任何东西.下面列出.

public class ClaimsAuthorizeAttribute : AuthorizeAttribute
{
    private string claimType;
    private string claimValue;
    public ClaimsAuthorizeAttribute(string type, string value)
    {
        this.claimType = type;
        this.claimValue = value;
    }
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        var user = filterContext.HttpContext.User as ClaimsPrincipal;
        if (user != null && user.HasClaim(claimType, claimValue))
        {
            base.OnAuthorization(filterContext);
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,如果您乐意以某种方式使用controller-action-verb triplet来声明索引,则可以删除类型和值params.

  • 为了向前兼容,最好使用`filterContext.HttpContext.user`. (6认同)
  • @ Stimul8d感谢您的回答,这在我的MVC 5应用程序中完美运行!对我来说更有意义的是实现自己的ClaimsAuthorizationAttribute然后使用ClaimsAuthorizationManager(需要太多配置) (2认同)

lea*_*ege 30

  1. 您不会专门检查索赔,而是检查操作/资源对.将实际的索赔/数据检查分解为授权管理器.关注点分离.
  2. MVC和ClaimsPrincipalPermission不是很好的匹配.它抛出SecurityException并且不是单元测试友好的.

我的版本在这里:http: //leastprivilege.com/2012/10/26/using-claims-based-authorization-in-mvc-and-web-api/

  • @leastprivilege我想更新你的[博客文章](http://leastprivilege.com/2012/10/26/using-claims-based-authorization-in-mvc-and-web-api/)是有意义的有关重命名的属性和MVC和Web API 2.x的可用nuget包的信息?如果不是这个评论部分,我不知道我应该如何知道重命名;) (4认同)
  • 我不知道这个答案是否仍然是最新的,但我仍然不知道资源是什么,或者它与控制器操作和我拥有的声明有什么关系.作为一个不是Owin专家的人,你可以稍微扩大答案吗? (4认同)
  • 您的版本似乎不是最新的MVC 5版本?如果是这样,哪个Nuget包包含它? (2认同)
  • http://www.nuget.org/packages/Thinktecture.IdentityModel.SystemWeb/ - 并将其重命名为ResourceActionAuthorizeAttribute (2认同)

Sof*_*ion 8

我发现你仍然可以使用带有声明的角色和用户的Authorization属性.
为此,您的ClaimsIdentity必须包含两种特定的声明类型:

    ClaimTypes.Name
Run Code Online (Sandbox Code Playgroud)

    ClaimTypes.Role
Run Code Online (Sandbox Code Playgroud)

然后在您从OAuthAuthorizationServerProvider派生的类中,在您使用的GrantXX方法中,在创建ClaimsIdentity时,添加这两个声明.

例:

    var oAuthIdentity = new ClaimsIdentity(new[]
    {
        new Claim(ClaimTypes.Name, context.ClientId),
        new Claim(ClaimTypes.Role, "Admin"),
    }, OAuthDefaults.AuthenticationType);
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用任何操作[Authorize(Roles ="Admin")]来限制访问.