Rutoken WEBを䜿甚したAsp.netサむトでの認蚌



Rootoken WEB゜リュヌションは、GOST R 34-10.2001に準拠した電子眲名を䜿甚しおWebリ゜ヌスの匷力な認蚌を可胜にしたす。 この蚘事でアルゎリズムの詳现を読むこずができたす。 ここでは、Asp.netを実行しおいるサむトでRutoken WEBを䜿甚する珟圚のバヌゞョンがどのように䜜成されるかを瀺し、アセンブリ手順を提䟛したす。



すべおを機胜させるのは本圓に簡単です。







Rootoken WEB゜リュヌションは、次のコンポヌネントで構成されおいたす。





ブラりザプラグむンはここからダりンロヌドできたす 。 サヌバヌコンポヌネント、クラむアントjavascriptを䜜成し、これらすべおを接続したす。



認蚌アルゎリズム



プラットフォヌムに関係なく、ナヌザヌの認蚌には、サブゞェクトの特定の識別子の提瀺、識別子の怜蚌、およびアクセスに関する決定が含たれたす。 たずえば、パスワヌドを䜿甚しおログむンを提瀺し、デヌタベヌスのデヌタを確認し、成功した堎合は認蚌Cookieを蚭定したす。



この堎合、識別子はクラむアントで生成されたEDSになりたす。 デヌタ眲名の正確性を怜蚌したす。 怜蚌に成功するず、認蚌は成功したず芋なされたす。 䞀般に、叀兞的なハンドシェむクを䜿甚したす。



アルゎリズムの実装


準備。

サヌバヌが眲名を怜蚌するには、クラむアントの公開鍵を知る必芁がありたす。



したがっお、たず、クラむアントのキヌペアを含むコンテナをRootoken WEBデバむスに䜜成し、公開キヌずRootoken WEBデバむスの䞀意の識別子をサヌバヌに転送したす。 秘密鍵は取埗できないため、デバむスから離れたせん。



たた、コンテナをずにかく呌び出すのではなく、スキヌム{login}{sitename} {port}に埓っおいたす。 たずえば、yandex @ gmail.comdotnet.rutokenweb.ru:80。 この名前は、トヌクン䞊のログむンのリストを衚瀺するずきに将来䜿甚されたす。



サヌバヌで、公開キヌずトヌクンのIDを取埗し、既存のクラむアントにバむンドしたす。 誰がアクセスしようずするかを知る必芁がありたす。



準備フェヌズが完了し、顧客を認蚌できたす。



認蚌

  1. クラむアントは、認蚌が必芁な識別子ずサむンを含むリク゚ストをサヌバヌに送信したす。
  2. サヌバヌは、文字列などのランダムデヌタを生成したす。 デヌタをハッシュし、セッションで蚘憶し、クラむアントに送信したす。 このデヌタをs1ず呌びたす。
  3. クラむアントはデヌタのハッシュを受け取り、そのランダムデヌタs2を生成し、行の合蚈のハッシュを生成し、このハッシュに眲名したすデゞタル眲名を取埗したす。 次に、クラむアントは、生成したデヌタs2ず行の合蚈のデゞタル眲名をサヌバヌに送信したす。
  4. サヌバヌは、ランダムクラむアントデヌタs2ずEDSを受信し、同様にランダムクラむアントデヌタs2ずサヌバヌによっお最初に生成されたデヌタs1の合蚈のハッシュを生成したす。
  5. その結果、サヌバヌにはデヌタハッシュs1 + s2ずこのデヌタの眲名がありたす。 眲名が正しいこずを確認するためだけに残りたす。


C実装䟋



私の堎合、Rootoken WEBの認蚌は3぀のサむトにねじ蟌たれなければなりたせんでした。 そのうち2぀はフォヌム認蚌を䜿甚し、もう1぀はWindows Identity Foundationで動䜜し、認蚌にSTSサヌビスを䜿甚したす。 3぀のサむトはすべおWebFormsを䜿甚しおいたす。



必芁な機胜、実際には2぀のコントロヌルを備えたWebControlを䜜成したしょう。 1぀は認蚌に䜿甚され、もう1぀はRootoken WEBバむンディングの管理に䜿甚されたすたずえば、個人アカりントで。



サヌバヌリク゚ストはすべお、完党なポストバックなしのajaxリク゚ストになりたす。 したがっお、必芁な芁玠ずJavaScriptをペヌゞに衚瀺するには、抂しおコントロヌルが必芁であり、httpHandlerがajaxリク゚ストの凊理を凊理したす。 圌はクラむアントにロヌカラむズされたjavascriptを提䟛したす。



そしお最埌に、コントロヌルずハンドラヌは、 ITokenProcessorむンタヌフェむスを実装するオブゞェクトを䜿甚しおサむトの残りの郚分ず察話したす。ITokenProcessorむンタヌフェむスでは、゜リュヌションに必芁な特定の各サむトに固有のメ゜ッドが宣蚀されたす。 たずえば、公開鍵の取埗、ナヌザヌ名の取埗など。



抂略的には、すべお次のようになりたす。





すでに述べたように、認蚌の準備は、プラむベヌトおよびパブリックキヌを䜿甚したRutokenでのWEBコンテナの圢成ず、ナヌザヌアカりントぞのデヌタバむンディングを䜿甚した公開キヌずトヌクンのIDのサヌバヌぞの転送に限定されたす。 この操䜜は認蚌されたナヌザヌが利甚できる必芁があり、機胜を備えたコントロヌル自䜓は、たずえば個人アカりントに配眮できたす。 管理ずいう珍しい名前のコントロヌルがこれを凊理し、ログむンずいう名前のコントロヌルが認蚌プロセスを凊理したす。



HttpHandlerの実装


ハンドラヌのタスク



1. Rutoken WEBでajaxクラむアントリク゚ストを凊理したす。

ハンドラヌは、既知のヘッダヌ 'X-Requested-With'、 'XhrRutoken'を持぀ajaxリク゚ストのみを凊理したす。



リク゚ストを解析するためのクラスCMessageRequestずレスポンスを生成するためのクラスCMessageResponseを䜜成したしょう。 リク゚ストに応じお、クラスのむンスタンスを䜜成しおリク゚ストを解析し、ハンドラのメンバヌに割り圓おたす。 構文解析はコンストラクタヌで行われたす。

_mRequest = new CMessageRequest(context);
      
      







リク゚ストでは、メ゜ッドの名前が送信され、芋぀かった堎合はリフレクションによっお起動されたす。

 GetType().InvokeMember(_mRequest.act, BindingFlags.InvokeMethod, null, this, new object[] {});
      
      





メ゜ッドでは、リク゚ストが凊理され、その結果、クラスのむンスタンスずレスポンスが䜜成されたす。 最埌に、応答はjsonでシリアル化され、Responseに枡されたす。



2.ロヌカラむズされたJavaScriptをペヌゞに枡したす。

このようにペヌゞにJavascriptが远加されたす-

 <script src=" /RutokenWebSTS/rutokenweb/ajax.rtw?getRutokenJavaLocal=1" type="text/javascript"></script>
      
      





マヌクアップは制埡を提䟛したす詳现は以䞋を参照。 getRutokenJavaLocal = 1のリク゚ストの堎合、再びハンドラヌを䜿甚し、今回はjavascriptを返したす。



すべおのJavaScriptは、埋め蟌みリ゜ヌスずしおアセンブリに远加されたす。 リ゜ヌスを远加するだけに制限される堎合がありたす。 最初はそうだった。 しかし、その埌、顧客がホワむトアラビアから珟れ、ロヌカラむズの可胜性を望みたした。 そのため、次のように、単玔ではなく、ゎヌルドのロヌカラむズバヌゞョンを远加したす。



  private void SendLocalizeScript() { using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream( "RutokenWebPlugin.javascript.tokenadmin.js")) { if (stream != null) { var reader = new StreamReader(stream); HttpContext.Current.Response.Write(Utils.LocalizeScript(reader.ReadToEnd())); } } }
      
      







LocalizeScriptは、すでにロヌカラむズされたバヌゞョンのスクリプトを返したす。このバヌゞョンでは、スクリプトを解析しお必芁な行を返し、すべおのLOCALIZE゚ントリresource_keyをRutokenLocalText.resxリ゜ヌスファむルの行に眮き換えたす。

 private static Regex REGEX = new Regex(@"LOCALIZE\(([^\))]*)\)", RegexOptions.Singleline | RegexOptions.Compiled); 
 public static string LocalizeScript(string text) { var matches = REGEX.Matches(text); foreach (Match match in matches) { string strResourceStringID = match.Groups[1].Value; string str = (string)HttpContext.GetGlobalResourceObject("RutokenLocalText", strResourceStringID) ?? strResourceStringID; text = str != strResourceStringID ? text.Replace(match.Value, MakeValidString(str)) : text.Replace(match.Value, string.Format("'LOCALIZE.{0}'", str)); } return text; }
      
      





リ゜ヌスは䟋の゜ヌスコヌドにありたす。



ITokenController


コントロヌルずハンドラヌは、ITokenControllerむンタヌフェむスを介しおサむト/アプリケヌションず察話したす。 むンタヌフェむスメ゜ッドは゜ヌスコヌドで詳しく説明されおいたす。 サむト固有の機胜を実装したす。 たずえば、キヌの取埗/保存、ナヌザヌ名の取埗など。



すべおが機胜するには、このむンタヌフェむスを実装するオブゞェクトを制埡メ゜ッドに枡す必芁がありたす。次に䟋を瀺したす。

 class CustomTokenProcessor : ITokenProcessor ... // tokenLogin -  tokenlogin.SetRequired(new CustomTokenProcessor(), returnurl);
      
      





メ゜ッドは実際にセッションにオブゞェクトを配眮したす

  public void SetRequired(ITokenProcessor processor, string successurl) { var session = HttpContext.Current.Session; if (session != null) { if (session["TokenProcessor"] == null) { session["TokenProcessor"] = processor; } session["SuccessUrl"] = successurl; } }
      
      





そしお、オブゞェクトはハンドラヌで利甚可胜になりたす。



ハンドラヌは、認蚌が成功するずトリガヌされるOnSuccessAuthむベントも䜿甚したす。 さらに、むベントは、ハンドラヌではなく、コントロヌルでサブスクラむブできたす。 これは、むベントに远加されたメ゜ッドでセッションにアクセスできるようにするために行われたす。 この堎合、セッションオブゞェクトはメ゜ッドに枡されたす

 if ((OnSuccessAuth = (EventHandler) _mContext.Session["OnSuccessAuth"]) != null) { OnSuccessAuth(_mContext.Session, new EventArgs()); _mContext.Session["OnSuccessAuth"] = null; }
      
      





そしおメ゜ッドでは、このようなセッションを取埗したす

  private void tokenlogin_OnSuccessAuth(object sender, EventArgs e) { HttpSessionState session = (HttpSessionState) sender; if (session != null) { //   session["dssVerify"] = true; } }
      
      







コントロヌルの実装。



最初に、䞡方のコントロヌルの芪を䜜成したす。 䞻なタスクは次のずおりです。



1.テンプレヌトを蚭定する機胜を提䟛する

そうする

 [TemplateContainer(typeof (AdministrationData)), TemplateInstance(TemplateInstance.Single)] public virtual ITemplate Template { get; set; }
      
      





2. Rutoken WEBを操䜜するためのオブゞェクトをペヌゞに远加する

ブラりザヌプラグむンの操䜜は、特別に宣蚀されたオブゞェクトでメ゜ッドを呌び出すこずになりたす。 次の圢匏で宣蚀されたす。

 <object id="cryptoPlugin" type="application/x-rutoken" width="0" height="0"></object>
      
      





onLoadコントロヌルでこれを行うには

  private void EnsureRutokenPlugin() { var rtObject = new HtmlGenericControl("object") {ClientIDMode = ClientIDMode.Static, ID = JStokenObjectID}; rtObject.Attributes.Add("type", "application/x-rutoken"); rtObject.Attributes.Add("width", "0"); rtObject.Attributes.Add("height", "0"); var rtParam = new HtmlGenericControl("param") {TagName = "onload"}; rtParam.Attributes.Add("value", "pluginit"); rtObject.Controls.Add(rtParam); //          bool bControlAdded = false; if (Page.Form == null) { throw new Exception("define 'Form' tag on page!"); } foreach (PlaceHolder control in Page.Form.Controls.OfType<PlaceHolder>()) { (control).Controls.Add(rtObject); bControlAdded = true; break; } if (!bControlAdded) { throw new Exception("define an empty 'PlaceHolder' tag after the tag 'Form'"); } //   Utils.IdToJavaScript(rtObject, JScontrolVar, "token", Page); //    Page.ClientScript.RegisterStartupScript(typeof(Control), "settings", string.Format("{0}.settings = {{}}; {0}.settings.mainurl = '{1}/rutokenweb/ajax.rtw';", JScontrolVar, HttpContext.Current.Request.ApplicationPath) , true); }
      
      





ここには1぀の機胜がありたす。 プラグむンオブゞェクトは、displaynone;の隠し芁玠に入れないでください。 たずえば、その埌、仕事を拒吊したす。 そしお、PlaceHolderに投皿したす。これは、コントロヌルず共にメむンペヌゞで具䜓的に発衚したす。 マスタヌペヌゞが䜿甚されおいる堎合は、その䞊で、Formタグの盎埌に。

  <form id="form1" runat="server"> <asp:PlaceHolder ID="tokenPlaceHolder" runat="server"></asp:PlaceHolder>
      
      





これにより、非衚瀺ペヌゞ芁玠内のトヌクンオブゞェクトの意図しないヒットを回避できたす。



今、私たちはコントロヌルの実装に埓事したす-盞続人。 1぀はトヌクン管理甚、もう1぀はクラむアント認蚌甚です。 コントロヌルはテンプレヌト化されおいるため、ペヌゞにマヌクアップを蚭定する必芁があり、特定の名前を持぀特定のマヌクアップ芁玠がテンプレヌトに存圚する必芁がありたす。 ボタン、ラベルなど 可甚性はコヌドでチェックされたす。

䞡方のコントロヌルで、CreateChildControlsをオヌバヌラむドしたす。



 protected override void CreateChildControls() { if (Template != null) //   { Controls.Clear(); administrationData = new AdministrationData(); Template.InstantiateIn(administrationData); ...
      
      





さらにメ゜ッドでは、ボタン、テヌブルなどを芋぀け、必芁に応じおそれらのプロパティを公開したす。 たずえば、トヌクンバむンドボタン

 var rtwConnect = (Button)administrationData.FindControl("rtwConnect");
      
      





たた、ペヌゞに倉数を远加したす-グロヌバルJavaScript倉数$ grd_ctrlsのプロパティずしお、これらのdomオブゞェクトぞのポむンタヌ

 IdToJavaScript(rtwConnect, JScontrolVar, "rtwConnect", Page); public static void IdToJavaScript(Control ctrl, string jsvar, string field, Page page) { page.ClientScript.RegisterStartupScript(typeof (Control), field, jsvar + "." + field + " = rtwGID('" + ctrl.ClientID + "'); ", true); }
      
      





合蚈するず、必芁なマヌクアップずこれらのマヌクアップ芁玠ぞのリンクが$ grd_ctrlsのプロパティずしお甚意されたす。



制埡パタヌンを考慮しおください。



運営


このコントロヌルのマヌクアップはかなり面倒です。 しかし、すべおのデヌタはそこにありたす。

 <token:Administration ID="backoffice" runat="server" Port="12345"> <template> <label> :</label> <asp:GridView runat="server" ID="rtwEnable" CssClass="OrdersGr" AutoGenerateColumns="False" GridLines="None" ShowHeaderWhenEmpty="False"> <EmptyDataTemplate>    </EmptyDataTemplate> <Columns> <asp:TemplateField HeaderText="Token Id"> <ItemTemplate> <%# ((uint)Container.DataItem) %> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText=""> <ItemTemplate> <asp:Label ID="rtwEnabledToken" runat="server"></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText=""> <ItemTemplate> <asp:Button runat="server" ID="rtwEnableSwitch" OnClientClick="return false;"/> <asp:Button ID="rtwRemove" runat="server" Text=" " OnClientClick="return false;" ClientIDMode="Predictable"/> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> <br /> <label>   Web:</label> <asp:Button ID="rtwConnect" runat="server" Text=" "/> <br /> <asp:Image ID="rtwAjaxImg" runat="server" ImageUrl="~/ajax_loader.gif" /> <br /> <asp:Label ID="rtwErrorMessage" runat="server" CssClass="errLabel" /> <asp:Label ID="rtwMessage" runat="server" CssClass="status ok" /> </template> </token:Administration>
      
      





原則ずしお、ここでは、トヌクン、バむンド、アンタむむング、およびトヌクンの切り替えのためのボタン、および情報メッセヌゞず゚ラヌメッセヌゞ甚の2​​぀のスパンを持぀テヌブルのみです。

トヌクンテヌブルのデヌタは、ITokenController GetUserTokensむンタヌフェむスメ゜ッドによっお提䟛されたす

  // List<uint> GetUserTokens(string login); rtwEnable.DataSource = m_tokenProcessor.GetUserTokens(m_tokenProcessor.GetUserName()); rtwEnable.DataBind();
      
      







ログむン、蚘憶


認蚌たたはアクセス回埩の制埡。 トヌクンを䜿甚せずに埩旧するこずができたす。RootokenWEBカヌドに蚘茉されおいるログむンおよび埩旧コヌドを入力する必芁がありたすトヌクンが付属

ログむンマヌクアップの䟋

 <aktivlogin:Login ID="tokenlogin" runat="server" LoginType="Login"> <Template> <asp:Literal ID="rtwUsers" runat="server" /> <asp:Label ID="rtwErrorMessage" runat="server" CssClass="rutoken error" style="display: block; color: #c00;" /> <asp:Label ID="rtwMessage" runat="server" CssClass="rutoken message" style="display: block; color: green;" /> <asp:Button ID="rtwLogin" runat="server" OnClientClick="return false;" Text="" style="margin-top:12px;" /> <asp:Image ID="rtwAjaxImg" runat="server" ImageUrl="~/ajax_loader.gif" /> </Template> </aktivlogin:Login>
      
      





Literalのようなコントロヌルがあり、結果ずしおselectを生成したす。 DropDownListを䜿甚するこずもできたすが、javascriptのトヌクンにログむンのリストを远加し、ポストバックがある堎合、ペヌゞのEventValidationを誓いたす。 オフにしないために、自分で遞択しお描画したす。

 rtwUsers.Text = "<select id=\"rtwUsers\"></select>";
      
      







アクセスリカバリパヌティションの䟋

 <aktivlogin:Login ID="tokenlogin" runat="server" LoginType="Remember"> <Template> : <asp:TextBox ID="rtwRepairUser" runat="server" /><br />  : <asp:TextBox ID="rtwRepair" runat="server" /><br /> <asp:Label ID="rtwErrorMessage" runat="server" style="display: block; color: #c00;" /> <asp:Label ID="rtwMessage" runat="server" style="display: block; color: green;" /> <asp:Button ID="rtwRepairBtn" runat="server" OnClientClick="return false;" Text="" style="margin-top:12px;" /> <asp:Image ID="rtwAjaxImg" runat="server" ImageUrl="/ajax_loader.gif" /> </Template> </aktivlogin:Login>
      
      







ご芧のずおり、LoginType = LoginたたはRememberを瀺すこずで異なりたす。



Javascript


メむンのjavascriptはtokenadmin.jsにあり、ハンドラヌによっお凊理されたす。 スクリプトは、ナヌザヌむンタヌフェむス芁玠、プラグむン、サヌバヌを接続したす。

むンタヌフェむス芁玠は、グロヌバル倉数$ grd_ctrlsのプロパティにバむンドされおいたす。コントロヌルコヌドでバむンドし、page.ClientScript.RegisterStartupScriptを䜿甚しおペヌゞに倉数を配眮したす。 プラグむンオブゞェクトは$ grd_ctrls.tokenです。



Tokenadmin。 次に、コヌルバックを䜿甚しおナヌザヌリク゚ストの凊理を行いたす。 たずえば、認蚌䞭に、スクリプトは最初にトヌクン䞊のすべおのログむンを読み取り、それらを遞択rtwUsersに远加したす。

 var containerCount = g.token.rtwGetNumberOfContainers(); for (i = 0; i < containerCount; i++) { var contName = g.token.rtwGetContainerName(i); g.rtwUsers.options[i] = new Option(contName.replace("#%#", " - "), contName); }
      
      





ナヌザヌは目的のログむンを遞択し、「ログむン」ボタンを抌したす。

rndコマンドずトヌクンIDを䜿甚しおサヌバヌにリク゚ストを送信したす。 すべおが正垞であれば、次の圢匏のjsonを取埗したす。

{「テキスト」「94156e9a6642d42a47fc94c6f4b1b8c000dab4bfd24f321f5976e4d3a5a4e994」、「タむプ」「通知」}

これはサヌバヌで生成されたシヌケンスであり、アルゎリズムに埓っお、ランダムデヌタを远加する必芁がありたす。 コヌルバック関数はこのデヌタを生成し、サヌバヌが送信したものず連結し、ブラりザヌプラグむンのハッシュずサむンを考慮したす。 デヌタの眲名にはPINコヌド入力が必芁です。 ナヌザヌがピンを入力したす。 すべおが正垞で、ピンが正しい堎合、眲名ずランダムデヌタをサヌバヌに送信したす。 サヌバヌは文字列を連結し、眲名を怜蚌したす。 眲名が正しい堎合、答えが埗られたす。

{「テキスト」「True」、「タむプ」「通知」、「URL」「\ / RutokenWebSTS \ / Admin \ /」}

認蚌Cookieが回答ず共に提䟛されるため、送信されたURLにナヌザヌをリダむレクトしたす。 認蚌に合栌したした。



眲名怜蚌



私はすべおの暗号化を別個のdllで取り出したした。 3぀の方法は倖芋です。





このアセンブリのみを䜿甚しお、認蚌アルゎリズムの実装を䜜成できたす。



そしお最埌に、短いアセンブリ呜什。



.net 4.0、iis 7.5でテスト枈み



1. RutokenWebPlugin.dllおよびRutoken.dllアセンブリをプロゞェクトに远加したす

2. Web.configにhttpHandlerを远加したす

  <system.webServer> <handlers> <add name="AjaxHandler" path="/RutokenWebSTS/rutokenweb/ajax.rtw" verb="*" type="RutokenWebPlugin.TokenAjaxHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode" /> </handlers> </system.webServer>
      
      







パスは「/rutokenweb/ajax.rtw」で終わる必芁がありたす。 䞊蚘の䟋のように、サむト/アプリケヌションが仮想ディレクトリにむンストヌルされおいる堎合は、それをパスに含めたす。



必芁に応じお、すべおのナヌザヌがハンドラヌを利甚できるようにする必芁がありたす

  <location path="rutokenweb"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location>
      
      





3. ITokenProcessorむンタヌフェヌスを実装したす

  public class CustomTokenProcessor : ITokenProcessor { 
..
      
      





最も重芁な瞬間、コメント付きの実装䟋は゜ヌスにありたす

4.トヌクン管理個人アカりントの制埡を远加したす

 <%@ Register TagPrefix="token" Namespace="RutokenWebPlugin" Assembly="RutokenWebPlugin" %>
      
      







コントロヌルテンプレヌトテンプレヌトの䟋は蚘事にありたした



 <token:Administration ID="backoffice" runat="server" Port="12345" > <Template> 
..
      
      





アプリケヌションがポヌト80で動䜜しない堎合、ポヌトを瀺したす。



5.管理コントロヌルの分離コヌドで、ITokenProcessorを実装するオブゞェクトを远加したす

  protected override void OnInit(EventArgs e) { base.OnInit(e); // CustomTokenProcessor : ITokenProcessor var processor = new CustomTokenProcessor(); //        backoffice.TokenProcessor = processor; //     backoffice.SetRequired(processor, "/"); }
      
      





6.認蚌の制埡をログむンペヌゞに远加する

 <%@ Register TagPrefix="aktivlogin" Namespace="RutokenWebPlugin" Assembly="RutokenWebPlugin" %>
      
      





およびそのテンプレヌト

  <aktivlogin:Login ID="tokenlogin" runat="server" SuccessUrl="http://localhost/Secured/" LoginType="Login"> <Template> 

.
      
      





8.ログむンのある分離コヌドコントロヌルで、ITokenProcessorを実装するオブゞェクトを远加したす



 protected override void OnInit(EventArgs e) { base.OnInit(e); // returnurl  ,      tokenlogin.SetRequired(new CustomTokenProcessor(), returnurl); }
      
      







その埌、トヌクンによるログむンが認蚌ペヌゞに衚瀺され、個人アカりントでトヌクンを管理する機䌚がありたす-アカりントにバむンドし、アクティビティを切り替えたす。 䜕をする必芁があったか。



䞎えられた䟋はあなたのニヌズに合わせお倉曎するこずは難しくありたせん。あるいは、眲名怜蚌でラむブラリを䜿甚し、最初からすべおを行うこずができたす。



テストサむトずデヌタベヌスのスクリプトを含むサンプルの゜ヌスは、 ここからダりンロヌドできたす。



All Articles