我正在开发一个新的应用程序并使用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");
}
}
答案 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/