Asp.Netユーザーとの連携の例として、Linqを介した1C:Enterpriseディレクトリーへの直接入力

Asp.Netユーザーとの連携の例として、Linqを介した1C:Enterpriseディレクトリーへの直接入力



この記事では、MSSQLデータベースにあるディレクトリ1C:Enterprise 8にWebサイトユーザーを登録する方法について説明します。 さらに、ユーザーは、登録時に指定したユーザー名とパスワードを使用してサイトにログインできます。 作業はUsersというディレクトリでのみ実行され、1C configuratorを介してユーザーと作業するシステムには影響しません。



最も簡単な登録および許可操作のみが説明されています。 電子メールで通知するパスワード回復の補助操作は対象外です。 この作業は、Linqを介してMSSQLデータベースに直接アクセスすることにより行われます。 このアプローチにより、Asp.Netと1Cの両方の機能を使用できるだけでなく、さまざまなCMSの形で仲介者を省くことができます。







1Cでのディレクトリユーザーの作成:エンタープライズ



1C情報ベースが作成され、ローカルネットワーク内のMSSQLサーバー上にあるか、ホスティングプロバイダーからリモートにあると想定されています。



9文字のストリングと25文字の名前の形式のコードを使用して、コンフィギュレーターを介してUsersディレクトリーを作成する必要があります。



1Cでのディレクトリユーザーの作成:エンタープライズ



フィールドの構造は次のとおりです(フィールドのリストは、機能をさらに拡張するために豊富に用意されています)。





作成されたディレクトリのインターフェイスは1Cからすぐにアクセスできるため、管理インターフェイスの作成にかかる時間を節約できます。 これは、1C:エンタープライズツールのすべての武器が利用可能な場合の方法の利点の1つです。 その他の利点には、物理​​的な削除なしの削除のマーク付け、フィルターと検索、ACSクエリの作成機能、データ変換による他の1Cデータベースとの交換などがあります。



たとえば、登録ユーザーのリストは、コンフィギュレーターでディレクトリが定義された直後に利用できます。



登録されたユーザーのリストは、コンフィギュレーターでディレクトリを決定した直後に利用可能です



また、ユーザー編集フォーム:



ユーザー編集フォームインターフェイス



MSSQLデータベースへの直接アクセスのセットアップ





データにアクセスするには、LINQ定義を含むcsファイルを生成する必要があります。 生成するには、LinqTo1Cユーティリティを使用して、アンロードする必要があるディレクトリとMSSQLデータベースへの接続文字列を指定する必要があります。 私たちの場合、ディレクトリのみをアンロードすれば十分です。



バージョン1.2以降、LinqTo1Cでは、データを変更する機能を備えた構成ファイルを作成できます。 データベースへの直接書き込みの利点にもかかわらず、この方法には欠点があります。 たとえば、この方法で記録された情報は、交換計画に自動的に登録されません。 自分でデータの正確性を維持する必要があります。一意のコードを生成し、他のオブジェクトとの整合性を維持し、新しく入力したデータを確認します。



LinqTo1Cユーティリティ



ユーティリティの結果、次の2つのファイルが表示されます。dbml-視覚的なプレゼンテーション用とcs- C#プロジェクトへの追加用。 Visual Studioエディターでは次のようになります。



Visual StudioでLinqTo1Cを操作した結果



登録と承認のためのAsp.Netコード



このコードは、Asp.Net MVC用であり、AccountControllerがユーザーの作業を担当します。



AccountController:

public ActionResult LogOn() { ViewBag.Title = Resources.Account.LogonTitle; return View("~/Views/Dotnet/Logon.cshtml"); } [HttpPost] public ActionResult LogOn(LogOnModel model, string returnUrl) { if (ModelState.IsValid) { if (MembershipService.ValidateUser(model.UserName, model.Password)) { FormsService.SignIn(model.UserName, model.RememberMe); if (Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } else { return RedirectToAction("Index", "Dotnet"); } } else { ModelState.AddModelError("", ""); } } // If we got this far, something failed, redisplay form return View("~/Views/Dotnet/Logon.cshtml", model); } public ActionResult LogOff() { FormsService.SignOut(); return RedirectToAction("Index", "Dotnet"); } public ActionResult Register() { ViewBag.Title = Resources.Account.RegisterTitle; ViewBag.PasswordLength = MembershipService.MinPasswordLength; return View("~/Views/Dotnet/Register.cshtml"); } [HttpPost] public ActionResult Register(RegisterModel model) { if (ModelState.IsValid) { // Attempt to register the user MembershipCreateStatus createStatus = MembershipService.CreateUser(model.UserName, model.Email, model.Password, model.ConfirmPassword); if (createStatus == MembershipCreateStatus.Success) { FormsService.SignIn(model.UserName, false /* createPersistentCookie */); return RedirectToAction("Index", "Dotnet"); } else { ModelState.AddModelError("", AccountValidation.ErrorCodeToString(createStatus)); } } // If we got this far, something failed, redisplay form ViewBag.PasswordLength = MembershipService.MinPasswordLength; return View("~/Views/Dotnet/Register.cshtml", model); }
      
      







FormsService.SignOut



およびFormsService.SignIn



呼び出しは、標準メソッドFormsAuthentication.SignOut



およびFormsAuthentication.SetAuthCookie



リダイレクトされるため、それほど興味深いものでFormsService.SignIn



ません。



AccountMembershipService



クラスは、MSSQLデータベースにアクセスします。



ユーザーを登録するには、 CreateUser



メソッドをCreateUser



ます。 まず、考えられるエラーがチェックされます。空のログイン、パスワード、電子メール、ログイン/電子メールの重複、パスワードの一致、パスワードの確認。 次に、ユーザーフィールドに入力します。 リンクには新しいGuidが割り当てられ、番号は最大数+ 1として検索されます。パスワードはチェックサムとして閉じられたものに保存され、チェックサムはユーザーのパスワードと一意のプレフィックスから計算されます。

 public MembershipCreateStatus CreateUser(string userName, string email, string password, string confirmPassword) { if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName"); if (String.IsNullOrEmpty(password)) throw new ArgumentException("Value cannot be null or empty.", "password"); if (String.IsNullOrEmpty(email)) throw new ArgumentException("Value cannot be null or empty.", "email"); MembershipCreateStatus status = MembershipCreateStatus.ProviderError; using (var dataContext = new ElisyCMS(ConfigurationManager.ConnectionStrings["ElisyCMS"].ConnectionString)) { if (dataContext..Where(m => m. == userName && m. == new Binary(new byte[]{0})).Count() != 0) return MembershipCreateStatus.DuplicateUserName; if (dataContext..Where(m => m.Email == email && m. == new Binary(new byte[] { 0 })).Count() != 0) return MembershipCreateStatus.DuplicateEmail; if (password != confirmPassword) return MembershipCreateStatus.InvalidPassword; try {  user = new (); user. = Guid.NewGuid().ToByteArray(); user. = new byte[] { 0 }; user. = new byte[] { 0 }; var codeRequest = from a in dataContext. where Convert.ToInt32(a.) > 0 orderby Convert.ToInt32(a.) descending select Convert.ToInt32(a.); var lastCode = codeRequest.Take(1).FirstOrDefault(); user. = (lastCode + 1).ToString().PadLeft(9, '0'); user. = userName; byte[] saltBytes = new byte[8]; new RNGCryptoServiceProvider().GetBytes(saltBytes); user. = Convert.ToBase64String(saltBytes); byte[] passwordBytes = System.Text.Encoding.UTF8.GetBytes(user. + password); byte[] hash = new SHA1CryptoServiceProvider().ComputeHash(passwordBytes); user. = Convert.ToBase64String(hash); user. = DateTime.Now; user. = DateTime.Now; user. = new Binary(new byte[] { 1 }); user. = System.Threading.Thread.CurrentThread.CurrentUICulture.Name; //user. = Guid.NewGuid().ToString(); user.Email = email; dataContext..InsertOnSubmit(user); dataContext.SubmitChanges(); return MembershipCreateStatus.Success; } catch (Exception ex) { return MembershipCreateStatus.ProviderError; } } return status; }
      
      





ValidateUserメソッドは認証に使用されます。パラメータをチェックした後、データベース内のユーザーの存在、アクティビティフラグをチェックし、パスワードのチェックサムと送信されたパスワードの計算されたチェックサムおよび一意のプレフィックスとの比較を試みます。

  public bool ValidateUser(string userName, string password) { if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName"); if (String.IsNullOrEmpty(password)) throw new ArgumentException("Value cannot be null or empty.", "password"); using (var dataContext = new ElisyCMS(ConfigurationManager.ConnectionStrings["ElisyCMS"].ConnectionString)) { var  = dataContext..Where(m => m..ToUpper() == userName.ToUpper()).FirstOrDefault(); if ( == null) return false; if (..ToArray()[0] == 0) return false; if (String.IsNullOrWhiteSpace(.)) return true; byte[] passwordBytes = System.Text.Encoding.UTF8.GetBytes(. + password); byte[] hash = new SHA1CryptoServiceProvider().ComputeHash(passwordBytes); return Convert.ToBase64String(hash).Equals(.); } }
      
      






All Articles