zoukankan      html  css  js  c++  java
  • Enterprise Library: Security Quickstart代码解析篇, Part 2

    Enterprise Library: Security Quickstart代码解析篇

    Part 2

    Written by: Rickie Lee (rickieleemail#yahoo.com)
    My blog: www.cnblogs.com/rickie

    Enterprise Library: Security Quickstart代码解析篇, Part 1 
    ****** 

    2. Authentication

    根据用户提供的凭据验证用户的合法性。

    1)通过凭据验证用户

    首先调用AuthenticationFactory.GetAuthenticationProvider方法,并根据Configuration配置文件中包含的Authentication Provider配置信息,创建authenticationProvider认证提供程序对象。然后根据用户输入的用户名和密码,构造包含凭据的NamePasswordCredential对象。

    下一步调用authenticationProvider.Authentication方法,并传入NamePasswordCredential凭据对象。如果验证通过,则返回true,并且填充用户身份信息到成员变量identity,否则返回false

     

    如下是进行用户合法性验证的典型代码:

    private IAuthenticationProvider authenticationProvider;

    private bool authenticated;

    private IIdentity identity;

    // The authentication provider "Authentication Provider" is defined in configuration

    this.authenticationProvider = AuthenticationFactory.GetAuthenticationProvider("Authentication Provider");

    ……

    string username = this.credentialsForm.Username;

    string password = this.credentialsForm.Password;

    byte[] passwordBytes = ASCIIEncoding.ASCII.GetBytes(password);

     

    NamePasswordCredential credentials = new NamePasswordCredential(username, passwordBytes);

    this.authenticated = this.authenticationProvider.Authenticate(credentials,out this.identity);

     

    if (this.authenticated)

    {

           this.DisplayAuthenticationResults(SR.ValidCredentialsMessage(username));

    }

    else

    {

           this.DisplayAuthenticationResults(SR.InvalidCredentialsMessage(username));

    }

     

    2)获取已验证用户的临时Token

    缓存已验证用户的identity信息,并检索对应identitytoken

    首先定义用来保存token和缓存cache的成员变量。

    然后调用SecurityCacheFactory.GetSecurityCacheProvider方法,并根据Configuration配置信息创建安全缓存(Security Cache)提供程序实例。

    下一步调用CachingStoreProviderSaveIdentity方法,缓存用户identity信息并返回已验证用户的临时token

    如下是获取已验证用户临时Token的典型代码:

    // Token for valid identity

    private IToken token;

    // Security cache to handle tokens

    private ISecurityCacheProvider cache;

    this.cache = SecurityCacheFactory.GetSecurityCacheProvider("Caching Store Provider");

    ……

    if (this.identity != null)

    {

           // Cache the identity. The SecurityCache will generate a token which is then

           // returned to us.

           this.token = this.cache.SaveIdentity(this.identity);

          

           this.DisplayAuthenticationResults(SR.CreateTokenMessage(this.token.Value));

    }

    else

    {

           // Tell the user that this scenario requires an authenticated user

           this.DisplayAuthenticationResults(SR.CreateTokenRequiresIdentityMessage);

    }

     

    3)使用token检索用户identity信息

    通过使用token,而不是频繁使用凭据来认证用户,提高应用程序的性能。这样token成为用户/密码凭据的一种有效替换方式。

    直接调用安全缓存(Security Cache)提供程序的GetIdentity方法,并传入token值(该token是在缓存用户identity信息时创建的),就可以检索用户的identity信息。

    如下是典型代码:

    if (this.token != null)

    {

           // Retrieves the identity previously saved by using the corresponding token

           IIdentity savedIdentity = this.cache.GetIdentity(this.token);

          

           if (savedIdentity != null)

           {

                  this.DisplayAuthenticationResults(SR.RetrieveIdentityMessage(

    savedIdentity.Name, savedIdentity.AuthenticationType));

           }

           else

           {

                  // Token is not valid - it was likely expired.

                  this.DisplayAuthenticationResults(SR.ExpiredTokenErrorMessage);

           }

    }

    else

    {

           // Scenerio requires that an identity was created by authenticating using credentials

           this.DisplayAuthenticationResults(SR.RetrieveIdentityErrorMessage);

    }

     

    4)使token过期(终止用户session

    在用户logout应用程序时,使token过期,终止用户session

    通过调用安全缓存(Security Cache)提供程序的ExpireIdentity方法来实现。典型代码如下所示:

    if (this.token != null)

    {

           // Expires the identity previously saved by using the corresponding token

           this.cache.ExpireIdentity(this.token);

          

           this.DisplayAuthenticationResults(SR.ExpireTokenMessage);

    }

    else

    {

           // Scenerio requires that an identity was previously cached

           this.DisplayAuthenticationResults(SR.ExpireTokenErrorMessage);

    }

    ***

    作者:Rickie Lee (rickieleemail#yahoo.com)

    本文参考分析Enterprise Library Security Application Block Quickstart应用程序。

     

    References:

    1. Microsoft Enterprise Library: Enterprise Library Security Application Block Quickstart.

    2. Rickie, Microsoft patterns & practices Enterprise Library January 2005 [中文稿], http://www.cnblogs.com/rickie/archive/2005/01/30/99443.html

    3. Rickie, Enterprise Library released! http://www.cnblogs.com/rickie/archive/2005/01/29/99106.html

     

     

  • 相关阅读:
    linux -- 部署java服务器(3) linux安装redis
    linux 安装php8
    linux mysql查看日志
    linux mysql常用的命令
    perl heredoc
    perl数值进制
    提问的智慧
    How to ask question the smart way
    PERL命令行
    图灵/异步图书
  • 原文地址:https://www.cnblogs.com/rickie/p/109746.html
Copyright © 2011-2022 走看看