2016-02-15 3 views
-1

Я использую аутентификацию Microsoft/Google/Facebook в моем приложении MVC asp.net, которое аутентифицирует пользователя & перенаправляет пользователей на мой сайт. Это прекрасно работает.Аутентификация ASP.NET MVC с использованием внешнего поставщика - Google/Facebook

Вопрос: Любой, у кого есть учетная запись Microsoft/Google/Facebook, может войти в мою заявку. Я должен разрешать пользователям только тех, кто зарегистрирован/отображен в нашей базе данных, т. Е. Если человек приобрел лицензии, он может войти в систему с использованием внешнего провайдера.

Пример: 1) Пользователь1 имеет учетную запись Microsoft/Google & user1 является допустимым пользователем в нашей базе данных. Поэтому мы можем позволить ему увидеть контент с нашего сайта. 2) user2 имеет учетную запись microsoft/Google, но он не является допустимым пользователем в нашем db. Он не должен иметь возможности получить доступ к нашему сайту.

Как достичь этого в ASP.NET MVC. Я использую клиентский идентификатор ключа & от внешних поставщиков.

пример кода из класса запуска

app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions() 
    { 
    ClientId = "", 
    ClientSecret = "" 
    }); 

ответ

0

В AccountController.cs (код по умолчанию, если вы не изменили его)

[AllowAnonymous] 
    public ActionResult ExternalLoginCallback(string returnUrl) 
    { 
     AuthenticationResult result = OAuthWebSecurity.VerifyAuthentication(Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl })); 
     if (!result.IsSuccessful) 
     { 
      return RedirectToAction("ExternalLoginFailure"); 
     } 

     if(EmailNotRegistered(result.ExtraData["userid"])) 
     { 
      FormsAuthentication.SignOut(); 
      return RedirectToAction("ExternalLoginFailure"); 
     } 

     var bresult = OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false); 
     if (bresult) 
     { 
      return RedirectToLocal(returnUrl); 
     } 

     // etc... 
    } 

Вам нужно будет написать функцию bool EmailNotRegistered(string email) и сделать логику где он проверяет локальную базу данных. В API-интерфейсе членства может быть что-то уже доступное, но я не знаю прямо сейчас.

Кстати, каждый поставщик отличается от других, поэтому поле ExtraData может быть «электронной почтой» или чем-то еще - используйте отладчик, чтобы узнать!

+0

Вот код в моем AccountController – user5863509

0

Вот мой AccountController

public async Task<ActionResult> ExternalLoginCallback(string returnUrl) 
     { 
      var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 
      if (loginInfo == null) 
      { 
       return RedirectToAction("Login"); 
      } 

      // Sign in the user with this external login provider if the user already has a login 
      var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false); 
      switch (result) 
      { 
       case SignInStatus.Success: 
        return RedirectToLocal(returnUrl); 
       case SignInStatus.LockedOut: 
        return View("Lockout"); 
       case SignInStatus.RequiresVerification: 
        return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false }); 
       case SignInStatus.Failure: 
       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; 
        return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email }); 
      } 
     } 
+0

Тогда у вас есть свой ответ! '// Если пользователь не имеет учетной записи, в настоящее время отмечается, где вы обычно разрешаете пользователю регистрироваться для локальной учетной записи. Измените это, чтобы отобразить разрешенное разрешение или что-то еще. – Lukos

Смежные вопросы