2016-08-10 9 views
1

私は、Entity Frameworkを利用するASP.NET MVC 5(C#)Webアプリケーションと、ログイン認証用のGoogle OAuthV2を構築しています。ASP.NET MVC 5 EF - Google OAuthv2セキュアトークンとHD検証

は、私は、次の3つの事を必要とする:特定のドメイン内のGoogleのビジネス メールを持つユーザーのみがログインを許可されるように

  1. は、Webアプリケーションをセキュア (*@thisIsMyBusinessDomain.com)。
  2. ログインしているすべてのGoogleアカウントを非表示にし、必要な作業ドメインの には該当しません。 サーバー側
  3. チェックは、ログイン 時に提出されたトークンを検証し、トークンが( はそれを使用しようとする/ユーザーのログインおよびそれを発行する必要があります)、Googleはそれを割り当てられたユーザーのためにある検証します。

残念ながら、私がGoogleのドキュメントで読んだ多数のリンクは、古くなっているか、パッケージを見つけることができないか、実際には可能なパラメータhd(Hosted Domain)ビジネス電子メールアカウントのログイン手順ではHTTPリクエストで参照してください。アクセス/設定/取得/タップイン、ASP.NET(C#)ではなく、PHP/Python/Javaライブラリやスクリプト私はASP.NET(C#)で作業する必要があるので利用したくありません。

using System; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Web; 
using System.Web.Mvc; 
using Microsoft.AspNet.Identity; 
using Microsoft.AspNet.Identity.Owin; 
using Microsoft.Owin.Security; 
using STCMonitoringPortal.Models; 

... 
... 
... 

public ApplicationSignInManager SignInManager 
     { 
      get 
      { 
       return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>(); 
      } 
      private set 
      { 
       _signInManager = value; 
      } 
     } 
... 
... 
... 
     // 
     // POST: /Account/ExternalLogin 
     [HttpPost] 
     [AllowAnonymous] 
     [ValidateAntiForgeryToken] 
     public ActionResult ExternalLogin(string provider, string returnUrl) 
     { 
      // Request a redirect to the external login provider 
      return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl })); 
     } 
... 
... 
... 
     // 
     // GET: /Account/ExternalLoginCallback 
     [AllowAnonymous] 
     public async Task<ActionResult> ExternalLoginCallback(string returnUrl) 
     { 
      var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 
      if (loginInfo == null) 
      { 
       return RedirectToAction("Login"); 
      } 

      string userName = loginInfo.ExternalIdentity.GetUserName(); 
      string userId = loginInfo.ExternalIdentity.GetUserId(); 
      string email = loginInfo.Email; 
      string defaultUserName = loginInfo.DefaultUserName; 
      string loginProvider = loginInfo.Login.LoginProvider; 
      string loginProviderKey = loginInfo.Login.ProviderKey; 

      //These are null if the account has no first AND last name and will throw an exception 
      string actorName = "null"; 
      //if (loginInfo.ExternalIdentity.Actor.Name != null) 
       //actorName = loginInfo.ExternalIdentity.Actor.Name; 
      string actorAuthenticationType = "null"; 
      //loginInfo.ExternalIdentity.Actor.AuthenticationType; 
      string actorNameClaimType = "null"; 
      //loginInfo.ExternalIdentity.Actor.NameClaimType; 


      System.Diagnostics.Debug.Print(Environment.NewLine + "Username: " + userName 
       + Environment.NewLine + "UserID: " + userId 
       + Environment.NewLine + "Email: " + email 
       + Environment.NewLine + "Default Username: " + defaultUserName 
       + Environment.NewLine + "Login Provider: " + loginProvider 
       + Environment.NewLine + "Login Provider Key: " + loginProviderKey 
       + Environment.NewLine + "Actor Name: " + actorName 
       + Environment.NewLine + "Actor Authentication Type: " + actorAuthenticationType 
       + Environment.NewLine + "Actor Name Claim Type: " + actorNameClaimType 
       + Environment.NewLine); 

      SignInStatus result; 

      if (!loginInfo.Email.EndsWith("@thisIsMyBusinessDomain.com") || 
       !loginInfo.Login.LoginProvider.Equals("Google") || 
       !loginInfo.ExternalIdentity.GetUserId().Equals(loginInfo.Login.ProviderKey)) 
      { 
       //Using the information gotten from the request 
       //If the Email Address is not from the domain thisIsMyBusinessDomain.com 
       //OR 
       //If the Login Provider is not listed as Google 
       //OR 
       //If the provided UserID does not match the Login Provider (Google's) Key 
       //Deny the user login access 
       System.Diagnostics.Debug.Print(Environment.NewLine + "Email: " + loginInfo.Email + 
        Environment.NewLine + "User Id: " + loginInfo.ExternalIdentity.GetUserId() 
        + Environment.NewLine + "Provider Key: " + loginInfo.Login.ProviderKey); 
       result = SignInStatus.LockedOut;    
      } 
      else 
      { 
       System.Diagnostics.Debug.Print(Environment.NewLine + "SignInManagerRunning: True"); 
       // Sign in the user with this external login provider if the user already has a login 
       result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false); 
      } 
      System.Diagnostics.Debug.Print(Environment.NewLine + result); 
      switch (result) 
      { 
       case SignInStatus.Success: 
        return RedirectToLocal(returnUrl); 
       case SignInStatus.LockedOut: 
        return View("AccessDenied"); 
       case SignInStatus.RequiresVerification: 
        return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false }); 
       case SignInStatus.Failure: 
        //return View("AccessDenied"); 
       default: 
        // If the user does not have an account, then prompt the user to create an account 
        ViewBag.ReturnUrl = returnUrl; 
        ViewBag.LoginProvider = loginInfo.Login.LoginProvider; 
        await ExternalLoginConfirmation(new ExternalLoginConfirmationViewModel { Email = loginInfo.Email }, 
    returnUrl); 
        return RedirectToLocal(returnUrl); 
        //comment out, do not let user choose username, their email will be used. 
        //return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email }); 
      } 
     } 

方法:

は現在、これは私がホストされた作業領域の一部ではない電子メールでログインからユーザーをブロックに単純化(および非セキュア)なアプローチを採用しているコードです上記の3つの目標を達成することはできますか?提案?

EDIT 1:(その答えと)前述したように Restrict Login Email with Google OAuth2.0 to Specific Domain Name

、上記のリンクポストPHPのための解決策ではなく、ASP.NETは次のとおりです。 は、私はすでに次のリンクを確認しました。さらに、正式には答えはありませんでした。ユーザーは「hd」パラメータが意図したとおりに機能しておらず、提案されたコードが安全でない(Fiddlerのようなツールを使用してバイパスする可能性がある)というインスタンスを報告しました。

+0

[の可能性のある重複したGoogleとのログインメールを制限OAuth2.0から特定のドメイン名](http://stackoverflow.com/questions/10858813/restrict-login-email-with-google-oauth2-0-to-specific-domain-name) –

+1

@TiesonT。私は既にあなたが引用したリンクを見直していましたが、これは古く、PHPではASP.NETではありません。さらに、提案された実装に関するセキュリティ上の懸念から正式には回答が得られませんでした。 – jat247

答えて

-2

次のブログはあなたに特に部品2 & 3を助けるかもしれないが、それは、Web APIについて2 & OWINであり、いくつかのtweekingを必要とするかもしれない...

ASP.NET Identity 2.1 with ASP.NET Web API 2.2

+0

残念ながら、あなたがリストアップしたサイトのドキュメントは、私が探しているものではなく、MVC 5のために古くなっています(現在存在するフレームワークを作成しようとしています。さらに、できるだけGoogleのAPIを使用する必要があります(これはログイン/認証に使用しているもので、独自のトークンサーバーなどを作成していないためです)。 – jat247