在ClaimsIdentity上实施ClaimType

时间:2014-02-19 04:58:00

标签: asp.net asp.net-mvc-5 owin

我正在开发一个新的应用程序并使用ASP.NET身份,并且想知道是否有一种方法可以强制执行ClaimIdentity上的特定声明类型。这就是我到目前为止所做的......它的确有效,但似乎有些东西应该/应该被内置,也许我只是找不到它。

 public void SignIn(IUserIdentity user, string authenticationType, bool isPersistent)
    {
        if (user == null)
        {
            string msg = "UserIdentity or UserIdentity is null";
            _logger.Error(msg);
            throw new NullReferenceException(msg);
        }
        List<Claim> claims = _claimService.GetClaims(user.UserId);

        var identity = new ClaimsIdentity(claims, authenticationType, ClaimTypes.Name, ClaimTypes.Role);
        if (claims.Any() && claims.Single(c => c.Type == ClaimTypes.Name).Value != null)
        {
            _owinContext.Authentication.SignIn(new AuthenticationProperties
            {
                IsPersistent = isPersistent
            }, identity);
        }
        else
        {
            throw new SecurityException("Invalid or null Name Claim");    
        }

    }

1 个答案:

答案 0 :(得分:3)

我不知道有任何内置的断言声明存在的方式。

修改

你是对的。我原来的解决方案是过度设计的。我认为你的解决方案是唯一的出路。

验证不正确,但原因有两个:

  • 如果在使用.Single后未找到声明,则抛出异常
  • Claim的值永远不能为空,因为它的构造函数会阻止它

应该是:

List<Claim> claims = _claimService.GetClaims(user.UserId);
if (claims.Any(i => i.Type == ClaimTypes.Name)
{
    var identity = new ClaimsIdentity(claims, authenticationType, ClaimTypes.Name, ClaimTypes.Role);

或者

var claims = _claimService.GetClaims(user.UserId);
var identity = new ClaimsIdentity(claims, authenticationType, ClaimTypes.Name, ClaimTypes.Role);
if (identity.Name != null)
{

<强>原始

我将如何分离身份验证和授权。

身份验证 - 验证用户

授权 - 验证用户有权执行的操作。

public class ClaimsAuthorizeAttribute : AuthorizeAttribute
{
    public string[] ClaimTypes { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext == null) { throw new ArgumentNullException("httpContext"); }

        var principal = httpContext.User as ClaimsPrincipal;
        return principal != null && HasAllClaimTypes(principal) && base.AuthorizeCore(httpContext);
    }

    private bool HasAllClaimTypes(ClaimsPrincipal principal)
    {
        return ClaimTypes == null || ClaimTypes.All(claimType => principal.HasClaim(claim => claim.Type == claimType));
    }
}

在全局过滤器中强制执行所有控制器所需的声明类型:

filters.Add(new ClaimsAuthorizeAttribute { ClaimTypes = new[]{ ClaimTypes.Name } });

如果不存在声明类型,则会将用户重定向到登录页面。 (你可能想要改变这种行为)

请参阅此文章http://leastprivilege.com/2012/10/26/using-claims-based-authorization-in-mvc-and-web-api/