71 lines
2.7 KiB
C#
71 lines
2.7 KiB
C#
// Copyright (c) .NET Foundation. All rights reserved.
|
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Microsoft.AspNet.Identity
|
|
{
|
|
/// <summary>
|
|
/// Provides the default validation of roles.
|
|
/// </summary>
|
|
/// <typeparam name="TRole">The type encapsulating a role.</typeparam>
|
|
public class RoleValidator<TRole> : IRoleValidator<TRole> where TRole : class
|
|
{
|
|
/// <summary>
|
|
/// Creates a new instance of <see cref="RoleValidator{TRole}"/>/
|
|
/// </summary>
|
|
/// <param name="errors">The <see cref="IdentityErrorDescriber"/> used to provider error messages.</param>
|
|
public RoleValidator(IdentityErrorDescriber errors = null)
|
|
{
|
|
Describer = errors ?? new IdentityErrorDescriber();
|
|
}
|
|
|
|
private IdentityErrorDescriber Describer { get; set; }
|
|
|
|
/// <summary>
|
|
/// Validates a role as an asynchronous operation.
|
|
/// </summary>
|
|
/// <param name="manager">The <see cref="RoleManager{TRole}"/> managing the role store.</param>
|
|
/// <param name="role">The role to validate.</param>
|
|
/// <returns>A <see cref="Task{TResult}"/> that represents the <see cref="IdentityResult"/> of the asynchronous validation.</returns>
|
|
public virtual async Task<IdentityResult> ValidateAsync(RoleManager<TRole> manager, TRole role)
|
|
{
|
|
if (manager == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(manager));
|
|
}
|
|
if (role == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(role));
|
|
}
|
|
var errors = new List<IdentityError>();
|
|
await ValidateRoleName(manager, role, errors);
|
|
if (errors.Count > 0)
|
|
{
|
|
return IdentityResult.Failed(errors.ToArray());
|
|
}
|
|
return IdentityResult.Success;
|
|
}
|
|
|
|
private async Task ValidateRoleName(RoleManager<TRole> manager, TRole role,
|
|
ICollection<IdentityError> errors)
|
|
{
|
|
var roleName = await manager.GetRoleNameAsync(role);
|
|
if (string.IsNullOrWhiteSpace(roleName))
|
|
{
|
|
errors.Add(Describer.InvalidRoleName(roleName));
|
|
}
|
|
else
|
|
{
|
|
var owner = await manager.FindByNameAsync(roleName);
|
|
if (owner != null &&
|
|
!string.Equals(await manager.GetRoleIdAsync(owner), await manager.GetRoleIdAsync(role)))
|
|
{
|
|
errors.Add(Describer.DuplicateRoleName(roleName));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |