В WCF пользовательский авторизации
в основном, я создаю свой первый веб-сервис WCF, и я хочу реализовать пользовательскую аутентификацию и авторизацию. Аутентификация, похоже, работает хорошо, но я хочу иметь возможность хранить роли и разрешения, используя пользовательскую авторизацию.
моя аутентификация выполняется путем переопределения UserNamePasswordValidator
и использование Validate
метод.
Validate(string UserName, string password)
теперь я попытался реализовать авторизацию с помощью IAuthorizationPolicy
интерфейс
public class AuthorizationPolicy : IAuthorizationPolicy
{
private string _id;
public string Id
{
get { return this._id; }
}
public ClaimSet Issuer
{
get { return ClaimSet.System; }
}
public AuthorizationPolicy()
{
_id = Guid.NewGuid().ToString();
}
public bool Evaluate(EvaluationContext context, ref object state)
{
IIdentity client = GetClientIdentity(context);
context.Properties["Principal"] = new CustomPrincipal(client);
return true;
}
private IIdentity GetClientIdentity(EvaluationContext evaluationContext)
{
object obj;
if (!evaluationContext.Properties.TryGetValue("Identities", out obj))
throw new Exception("No Identity found");
IList<IIdentity> identities = obj as IList<IIdentity>;
if (identities == null || identities.Count <= 0)
throw new Exception("No Identity found");
return identities[0];
}
}
и я также реализовал CustomPrincipal
С помощью IPrincipal
интерфейс.
public class CustomPrincipal : IPrincipal
{
IIdentity _identity;
string[] _roles;
public CustomPrincipal(IIdentity identity)
{
_identity = identity;
}
public static CustomPrincipal Current
{
get
{
return Thread.CurrentPrincipal as CustomPrincipal;
}
}
public IIdentity Identity
{
get { return _identity; }
}
public string[] Roles
{
get
{
if (_roles == null)
{
EnsureRoles();
}
return _roles;
}
}
public bool IsInRole(string role)
{
EnsureRoles();
return _roles.Contains(role);
}
protected virtual void EnsureRoles()
{
UserManager userManager = new UserManager();
int userPermissions = userManager.UserPermissions(_identity.Name);
if (userPermissions == 1)
_roles = new string[1] { "ADMIN" };
else
_roles = new string[1] { "USER" };
}
}
Мои Приложения.Конфигурация была обновлена по мере необходимости, и Evaluate
метод AuthorizationPolicy
называется, как ожидалось.
однако, здесь я застрял. Как я могу реализовать роли и разрешения отсюда?
2 ответов
Я бы предложил вам выбрать Инспектором Сообщение.
логика была бы следующей:
- клиент будет иметь инспектор сообщений, который установит необходимые заголовки для каждого запроса.
- инспектор сообщений на стороне сервера перехватит запрос, а затем прочитает заголовки и выполнит аутентификацию и авторизацию.
- у вас может быть несколько служб, таких как служба пользователя и роли, которые могут быть вызваны на сервере для проверьте учетные данные в заголовке и задайте идентификатор для этого запроса.
- эти службы будут получать доступ к магазину через DAL и будут находиться в режиме inproc.
вы можете обратиться к аутентификация и авторизация с помощью ASP.NET идентификатор 2.0 для служб WCF
в основном у вас будет 3 уровня для рассмотрения в соответствии с этой статьей:
Asp.net Identity 2.0, Если вы хотите использовать контекст out of the box, общий с приложениями MVC; или вы используете свою пользовательскую базу данных.
политика если вы хотите мелкозернистые элементы управления политикой безопасности