只處理和使用您的自定義驗證器中的憑據。如果憑證有效,則使用自定義授權策略爲該用戶準備一組具有角色的自定義主體,並使用PrincipalPermission屬性修飾您的服務方法。
[PrincipalPermission(SecurityAction.Demand, Authenticated = true, Role = "ClearedForUsingFoo")]
public void Foo(string bar)
{
...
class AuthorizationPolicy : IAuthorizationPolicy
{
public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
// get the authenticated client identity
IIdentity identity = GetClientIdentity(evaluationContext);
// set the custom principal
evaluationContext.Properties["Principal"] = new CustomPrincipal(identity);
return true;
}
public ClaimSet Issuer
{
get { throw new NotImplementedException(); }
}
public string Id
{
get { return "FooBarApp.AuthorizationPolicy"; }
}
private static 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];
}
}
我能夠通過此代碼獲取用戶名 – adnangohar 2011-05-24 12:06:56
OperationContext oc = OperationContext.Current; ServiceSecurityContext ssc = oc.ServiceSecurityContext; string client = ssc.PrimaryIdentity.Name; 有什麼方法可以獲得密碼嗎? – adnangohar 2011-05-24 12:07:27
簡短的回答是沒有。安全上下文將爲授權用戶提供「身份」,通常由用戶/帳戶名稱以及用戶所屬的角色/羣組組成。由於密碼僅用於身份驗證,因此它絕不會暴露給已經通過身份驗證的用戶。基本上,唯一可用的時間是在認證過程中。允許任何進程在認證過程之外訪問密碼是非常不安全的。 – 2011-05-24 15:11:51