黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Windows Credential Management with the .net

系統(tǒng) 2761 0
原文鏈接
<meta name="ProgId" content="Word.Document"> <meta name="Generator" content="Microsoft Word 11"> <meta name="Originator" content="Microsoft Word 11"> <link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C03%5Cclip_filelist.xml"> <link rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C03%5Cclip_editdata.mso"> <!--[if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><!--[if gte mso 9]><xml> <w:worddocument> <w:view>Normal</w:view> <w:zoom>0</w:zoom> <w:punctuationkerning/> <w:drawinggridverticalspacing>7.8 磅</w:drawinggridverticalspacing> <w:displayhorizontaldrawinggridevery>0</w:displayhorizontaldrawinggridevery> <w:displayverticaldrawinggridevery>2</w:displayverticaldrawinggridevery> <w:validateagainstschemas/> <w:saveifxmlinvalid>false</w:saveifxmlinvalid> <w:ignoremixedcontent>false</w:ignoremixedcontent> <w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext> <w:compatibility> <w:spaceforul/> <w:balancesinglebytedoublebytewidth/> <w:donotleavebackslashalone/> <w:ultrailspace/> <w:donotexpandshiftreturn/> <w:adjustlineheightintable/> <w:breakwrappedtables/> <w:snaptogridincell/> <w:wraptextwithpunct/> <w:useasianbreakrules/> <w:dontgrowautofit/> <w:usefelayout/> </w:compatibility> <w:browserlevel>MicrosoftInternetExplorer4</w:browserlevel> </w:worddocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:latentstyles deflockedstate="false" latentstylecount="156"> </w:latentstyles> </xml><![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:宋體; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"\@宋體"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋體; mso-font-kerning:1.0pt;} h4 {mso-margin-top-alt:auto; margin-right:0cm; mso-margin-bottom-alt:auto; margin-left:0cm; mso-pagination:widow-orphan; mso-outline-level:4; font-size:12.0pt; font-family:宋體; mso-bidi-font-family:宋體;} a:link, span.MsoHyperlink {color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {color:purple; text-decoration:underline; text-underline:single;} pre {margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:宋體; mso-bidi-font-family:宋體;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]-->

Windows Credential Management with the .net Framework 2.0

Kenny kerr

January 2006

Applies to:

Microsoft .NET Framework 2.0
NET Framework Security
Windows XP

概敘:這篇文章主要是介紹 Credential Management API 怎樣處理界面和用戶的憑證集合。同時(shí)也提供了一個(gè)能夠做一些簡(jiǎn)單憑證管理的類(lèi)庫(kù),可以被 c# vb.net 調(diào)用。

下載相關(guān)的例程: KerrCredentialsSample.exe

內(nèi)容

介紹

請(qǐng)求憑證

托管代碼的請(qǐng)求憑證

一個(gè)工具:請(qǐng)求憑證生成器

SecureString 基礎(chǔ)

憑證集合

在托管代碼中使用憑證集合

工具:憑證集合管理器

結(jié)論

?

?

介紹

管理用戶憑證是一件非常困難的事情。理想上你的 windows 域憑證應(yīng)該有足夠的權(quán)限來(lái)訪問(wèn)你可能需要的資源。但是有這么簡(jiǎn)單嗎?你可能不可避免的要去處理不同的安全權(quán)限,包括 windows 域, Microsoft Passport 和應(yīng)用程序指定的驗(yàn)證策略。好像那些還不夠挑戰(zhàn),憑證可能來(lái)自不同的 form ,包括 smart cards, certificates 和密碼。

?

自從 2001 windows xp 發(fā)布, windows 包含了 credential management api 去管理用戶憑證。這些 api 的設(shè)計(jì)是為了簡(jiǎn)化內(nèi)部程序用戶憑證管理,也為你自己的相關(guān)憑證管理提供了一致的安全的方法。她也可以被用來(lái)請(qǐng)求不需要被持久化的憑證,或者持久化你的應(yīng)用程序的憑證,比如用數(shù)據(jù)保護(hù) api Data Protection API .

?

在這篇文章我會(huì)介紹 windows credential management api 包括界面處理,憑證集合管理。介紹這些 api 的一個(gè)挑戰(zhàn)是依賴你的背景知識(shí)和你怎么去用她,這些是一個(gè) c-style api ,適用于 visual c++ 或者任何一款支持 windows 的編譯器。因?yàn)榱餍? .net 框架的原因,一個(gè)理想的解決方案還應(yīng)該包括 .net 框架的支持托管代碼的集合。所以也提供了一個(gè)功 .net 框架調(diào)用的類(lèi)庫(kù)。

?

最后要說(shuō)明的是: 當(dāng)我解釋 windows credential management 用到的不同的函數(shù),結(jié)構(gòu),也包括列在表格中的相關(guān)的選項(xiàng),標(biāo)志和屬性。雖然這些選項(xiàng)我的解釋很多都是依賴與 sdk msndn 類(lèi)庫(kù),但是我不止是簡(jiǎn)單的從文檔中 copy 說(shuō)明,我是盡力想你說(shuō)明她的一些你可能不能完全掌握的細(xì)節(jié)。這些都是基于我寫(xiě) credential management 經(jīng)驗(yàn)的積累。

?

請(qǐng)求憑證

如果你所需要得是你得域憑證,那么你不需要請(qǐng)求憑證。因?yàn)樵谀愕顷憰?huì)話時(shí)已經(jīng)被驗(yàn)證,你可以訪問(wèn)你可能能訪問(wèn)的所有資源。明顯的這是一個(gè)不現(xiàn)實(shí)的例子。所以你需要請(qǐng)求用戶的憑證。在過(guò)去,不用的應(yīng)用程序創(chuàng)建不用的用戶界面來(lái)請(qǐng)求用戶的憑證,但是在 windows xp 上,應(yīng)用程序可以依靠?jī)?nèi)建的,簡(jiǎn)單的,安全的用戶界面給用戶輸入。

Windows 提供了 CredUIPromptForCredentials 函數(shù)顯示一個(gè)可以配置的窗體去接收用戶的憑證信息。

    
      DWORD WINAPI CredUIPromptForCredentialsW(PCREDUI_INFOW info,
    
  
    
      
        ???????????????????????????????????????? 
      
      PCWSTR targetName,
    
  
    
      
        ???????????????????????????????????????? 
      
      PCtxtHandle reserved,
    
  
    
      
        ???????????????????????????????????????? 
      
      DWORD errorCode,
    
  
    
      
        ???????????????????????????????????????? 
      
      PWSTR userName,
    
  
    
      
        ????????????????? 
      
      
        ???????????????????????
      
      ULONG userNameBufferSize,
    
  
    
      
        ???????????????????????????????????????? 
      
      PWSTR password,
    
  
    
      
        ?????????????????????????????????????????? 
      
      ULONG passwordBufferSize,
    
  
    
      
        ???????????????????????????????????????? 
      
      PBOOL saveChecked,
    
  
    
      
      
      DWORD flags);
    
  
    因?yàn)檫@篇文章不是關(guān)于用
    
      c
    
    或者非托管的
    
      c++
    
    來(lái)管理用戶憑證,所以我不對(duì)這個(gè)函數(shù)做過(guò)多細(xì)節(jié)的描敘。
  
    
      

?

    第一個(gè)參數(shù)只向一個(gè)
    
      CREDUI_INFO
    
    結(jié)構(gòu)的指針,它允許你指定它的父窗體和默認(rèn)的圖標(biāo),標(biāo)題,信息。
  
    
      

?

    
      
        targetName
      
    
    參數(shù)用來(lái)讀取和寫(xiě)入憑證時(shí)的唯一定義,也被用來(lái)作為標(biāo)題和信息的一部分,如果
    
      CREDUI_INFO
    
    沒(méi)有被重寫(xiě)的話,晚些在我們討論
    
      persisting
    
    憑證的時(shí)候你會(huì)對(duì)她認(rèn)識(shí)的更深刻。
  
    
      Errorcode 
    
    參數(shù)允許窗體提供相應(yīng)的錯(cuò)誤代碼,但是
    
      sdk
    
    沒(méi)有提供相應(yīng)的鏈接,所以這個(gè)參數(shù)幾乎沒(méi)什么用。
  
    
      username 
    
       userNameBufferSize
    
    參數(shù)用來(lái)指定初始化時(shí)的用戶名。相應(yīng)的
    
      password
    
      passwordBufferSize
    
    用來(lái)指定初始化的用戶密碼。這些使得用
    
      c
    
    和非托管的
    
      c++
    
    編程相當(dāng)困難,你必須非常小心的處理這些字符串,像你在下一章看到的,托管代碼可以非常簡(jiǎn)單的寫(xiě)出非常優(yōu)秀的代碼。
  
    
      

?

    這個(gè)窗體可以顯示一個(gè)
    
      check box
    
    提供給用戶來(lái)選擇是否保存憑證。
    
      saveChecked 
    
    參數(shù)就是用來(lái)初始化這個(gè)
    
      check box 
    
    的狀態(tài)用的。這個(gè)
    
      check box
    
    也可以在用戶關(guān)閉窗體的時(shí)候來(lái)判斷用戶的喜好。注意的是這個(gè)參數(shù)被忽略,當(dāng)憑證不是
    
      generic
    
    憑證的時(shí)候。
  

?

最好, falgs 參數(shù)允許你指定一個(gè)聯(lián)合的標(biāo)識(shí)。這里的問(wèn)題是錯(cuò)誤的混合不同的標(biāo)識(shí)也會(huì)導(dǎo)致程序的錯(cuò)誤。

?

相比探索這個(gè)函數(shù)的更多細(xì)節(jié),我將會(huì)提供一些為簡(jiǎn)單任務(wù)的解決方案給你,用托管代碼寫(xiě)的。在那之前,我們先來(lái)看一看一個(gè)用 C++ 寫(xiě)的例子。這個(gè)例子調(diào)用 CredUIPromptForCredentials

?

    
      CREDUI_INFO info = { sizeof (CREDUI_INFO) };
    
  
    
      info.hwndParent = GetSafeHwnd();
    
  
    
    
  
    
      info.pszCaptionText = L"Title";
    
  
    
      info.pszMessageText = L"Message";
    
  
    
    
  
    
      CBitmap bitmap;
    
  
    
      VERIFY(bitmap.LoadBitmap(IDB_PROMPT_BITMAP));
    
  
    
      info.hbmBanner = bitmap;
    
  
    
    
  
    
      CString target;
    
  
    
      const DWORD errorCode = 0;
    
  
    
    
  
    
      wchar_t userName[CREDUI_MAX_USERNAME_LENGTH + 1] = { 0 };
    
  
    
    
  
    
      wcscpy_s(userName,
    
  
    
      
        ???????? 
      
      _countof(userName),
    
  
    
      
        ???????? 
      
      L"initial user name");
    
  
    
    
  
    
      wchar_t password[CREDUI_MAX_PASSWORD_LENGTH + 1] = { 0 };
    
  
    
    
  
    
      BOOL saveChecked = false;
    
  
    
    
  
    
      Const DWORD flags = CREDUI_FLAGS_DO_NOT_PERSIST | 
    
  
    
      
        ????????????????????
      
      CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX ;
    
  
    
    
  
    
      DWORD result = ::CredUIPromptForCredentials(&info,
    
  
    
      
        ??????????????????????????????????????????? 
      
      target,
    
  
    
      
        ??????????????????????????????????????????? 
      
      0, // reserved
    
  
    
      
        ??????????????????? 
      
      
        ????????????????????????
      
      errorCode,
    
  
    
      
        ??????????????????????????????????????????? 
      
      userName,
    
  
    
      
        ??????????????????????????????????????????? 
      
      _countof(userName)
    
  
    
      
        ??????????????????????????????????????????? 
      
      password,
    
  
    
      
        ??????????????????????????????????????????? 
      
      _countof(password)
    
  
    
      
        ??????????????????????????????????????????? 
      
      &saveChecked,
    
  
    
      
        ??????????????????????????????????????????? 
      
      flags);
    
  
    
    
  
    
      switch (result)
    
  
    
      {
    
  
    
      
        ??? 
      
      case NO_ERROR:
    
  
    
      
        ??? 
      
      {
    
  
    
      
        ??????? 
      
      // User chose OK...
    
  
    
      
        ??????? 
      
      break;
    
  
    
      
        ??? 
      
      }
    
  
    
      
        ??? 
      
      case ERROR_CANCELLED:
    
  
    
      
        ??? 
      
      {
    
  
    
      
        ?????? 
      
      
        ?
      
      // User chose Cancel...
    
  
    
      
        ??????? 
      
      break;
    
  
    
      
        ??? 
      
      }
    
  
    
      
        ??? 
      
      default:
    
  
    
      
        ??? 
      
      {
    
  
    
      
        ??????? 
      
      // Handle all other errors...
    
  
    
      
        ??? 
      
      }
    
  
    
      }
    
  
    
    
  
    
      ::SecureZeroMemory(password,
    
  
    
      
        ?????????????????? 
      
      sizeof (password));
    
  

這段代碼的結(jié)果是顯示一下的窗體:

<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style="'width:246pt; height:218.25pt'"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\03\clip_image001.png" o:title=""/> </v:shape><![endif]--><!--[if !vml]--> Windows Credential Management with the .net Framework 2.0 <!--[endif]-->

正像你所看到的,有一大段代碼是為了調(diào)用這個(gè)函數(shù)不會(huì)出錯(cuò),首先,你要熟悉結(jié)構(gòu) CREDUI_INFO 去控制這個(gè)窗體的不同元素。接下來(lái),你要為接收的用戶名合密碼準(zhǔn)備緩沖區(qū)。和顯示初始值。 CREDUI_MAX_USERNAME_LENGTH 常量表示用戶名的最大長(zhǎng)度。相同的 CREDUI_MAX_PASSWORD_LENGTH 表示密碼的可能最大長(zhǎng)度。在用戶名和密碼長(zhǎng)度后面加 1 是為了加上介紹字符串 NULL, 調(diào)用 wcscpy_s 函數(shù)是為了顯示用戶名和密碼的初始值。最后,我指定了兩個(gè)標(biāo)識(shí),意思是,我不想 persist 這個(gè)憑證但是我想讓保存密碼的 check box 顯示。 saveChecked 將會(huì)包括用戶的選項(xiàng)。

顯然在這里你很容易出錯(cuò)。

?

請(qǐng)求憑證,用托管代碼

因?yàn)? CredUIPromptForCredentials

[C++]

    
      ref class MainWindow : Windows::Forms::Form
    
  
    
      {
    
  
    
      public:
    
  
    
      

?

    
      
        ??? 
      
      void Prompt()
    
  
    
      
        ??? 
      
      {
    
  
    
      
        ??????? 
      
      PromptForCredentials dialog;
    
  
    
      

?

    
      
        ??????? 
      
      dialog.Title = "Title";
    
  
    
      
        ??????? 
      
      dialog.Message = "Message";
    
  
    
      
        ??????? 
      
      dialog.Banner = Images::Banner;
    
  
    
      
        ??????? 
      
      dialog.UserName = "initial user name";
    
  
    
      

?

    
      
        ??????? 
      
      dialog.DoNotPersist = true;
    
  
    
      
        ??????? 
      
      dialog.ShowSaveCheckBox = true;
    
  
    
      

?

    
      
        ??????? 
      
      if (Windows::Forms::DialogResult::OK == dialog.ShowDialog(this))
    
  
    
      
        ??????? 
      
      {
    
  
    
      
        ??????????? 
      
      // Use credentials wisely...
    
  
    
      
        ??????? 
      
      }
    
  
    
      
        ??? 
      
      }
    
  
    
      };
    
  

[C#]

    
      class MainWindow : Form
    
  
    
      {
    
  
    
      
        ??? 
      
      public void Prompt()
    
  
    
      
        ??? 
      
      {
    
  
    
      
        ??????? 
      
      using (PromptForCredentials dialog = new PromptForCredentials())
    
  
    
      
        ??????? 
      
      {
    
  
    
      
        ??????????? 
      
      dialog.Title = "Title";
    
  
    
      
        ??????????? 
      
      dialog.Message = "Message";
    
  
    
      
        ? 
      
      
        ??????????
      
      dialog.Banner = Images.Banner;
    
  
    
      
        ??????????? 
      
      dialog.UserName = "initial user name";
    
  
    
      

?

    
      
        ??????????? 
      
      dialog.DoNotPersist = true;
    
  
    
      
        ??????????? 
      
      dialog.ShowSaveCheckBox = true;
    
  
    
      

?

    
      
        ??????????? 
      
      if (DialogResult.OK == dialog.ShowDialog(this))
    
  
    
      
        ??????????? 
      
      {
    
  
    
      
        ??? 
      
      
        ????????????
      
      // Use credentials wisely...
    
  
    
      
        ??????????? 
      
      }
    
  
    
      
        ??????? 
      
      }
    
  
    
      
        ??? 
      
      }
    
  
    
      }
    
  


Windows Credential Management with the .net Framework 2.0


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論