0

WSEでユーザー名とパスワード(トークン)を確認する現在の方法は次のとおりです。

public override void VerifyToken(SecurityToken token1)
{
    if (token1 is UsernameToken)
    {
        string u1 = (token1 as UsernameToken).Username;
        string p1 = (token1 as UsernameToken).Password;

        // see if this user is already authenticated
        UsernameToken token2 = TokenCache[u1] as UsernameToken;
        if ((token2 != null) && token2.IsCurrent && (token2.Password == p1))
        {
            // less than 30s?
            if ((DateTime.Now - token2.Created) < TimeSpan.FromSeconds(30))
                return;
            else
                // no - remove from cache
                RemoveFromCache(token1);
        }

        // not cached, so actually check
        // NB Two or more requests for same user at about same time may all fail test above
        // and thus all will call ValidateUser.  But then they will all call CacheSecurityToken below,
        // which is OK - the last one wins.
        if (Membership.ValidateUser(u1, p1))
        {
            Cache(token1);
            return;
        }

        // not authenticated
        throw new Exception("Authentication failed for " + u1);
    }

WCFを変更するにはどうすればよいですか?Microsoft.Web.Service3WSEアセンブリを使用しました-使用したくありません。ソリューション全体からUsernameTokenを削除したい。

4

1 に答える 1

1

Webサービスの呼び出しごとにセキュリティクレデンシャルを確認しました。私はディレクトリのキーと値のペアを使用して資格情報をキャッシュしました-似たようなものを探している人がいれば、それは役に立ちます。

public class SecurityManager : UserNamePasswordValidator
{
    //cacheCredentials stores username and password
    static Dictionary<string, string> cacheCredentials = new Dictionary<string, string>();
    //cacheTimes stores username and time that username added to dictionary.
    static Dictionary<string, DateTime> cacheTimes = new Dictionary<string, DateTime>();

    public override void Validate(string userName, string password)
    {
        if (userName == null || password == null)
        {
            throw new ArgumentNullException();
        }
        if (cacheCredentials.ContainsKey(userName))
        {
            if ((cacheCredentials[userName] == password) && ((DateTime.Now - cacheTimes[userName]) < TimeSpan.FromSeconds(30)))// &&  timespan < 30 sec - TODO
                return;

            cacheCredentials.Remove(userName);
            cacheTimes.Remove(userName);
        }
        if (Membership.ValidateUser(userName, password))
        {
            //cache usename(key) and password(value)
            cacheCredentials.Add(userName, password);
            //cache username(key), time that username added to dictionary 
            cacheTimes.Add(userName, DateTime.Now);
            return;
        }
        throw new FaultException("Authentication failed for the user");       
    }
} 
于 2013-02-11T15:00:55.003 に答える