基本上,我正在创建我的第一个WCF Web服务,并且我正在寻求实现自定义身份验证和授权。身份验证似乎运行良好,但我希望能够使用自定义授权存储角色和权限。
我的身份验证是通过覆盖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" };
}
}
我的App.Config已根据需要进行了更新,Evaluate
中的AuthorizationPolicy
方法按预期调用。
但是,这就是我被困的地方。如何从这里开始实现角色和权限?
答案 0 :(得分:5)
我建议您选择Message Inspector。
逻辑如下:
答案 1 :(得分:3)
您可以参考Authentication and Authorization with ASP.NET Identity 2.0 for WCF Services
根据这篇文章,你基本上会考虑3个级别:
System.IdentityModel和System.Security.Principal
Asp.net Identity 2.0,如果您想使用与MVC应用程序共享的开箱即用的上下文;或者您使用自定义数据库。
策略是否需要对安全策略进行细粒度控制