MVC 4와 함께 OAuth 공급자 사용

Tom FitzMacken

이 자습서에서는 사용자가 Facebook, Twitter, Microsoft 또는 Google과 같은 외부 공급자의 자격 증명으로 로그인한 다음 해당 공급자의 일부 기능을 웹 애플리케이션에 통합할 수 있는 ASP.NET MVC 4 웹 애플리케이션을 빌드하는 방법을 보여 줍니다. 간단히 하기 위해 이 자습서에서는 Facebook의 자격 증명 작업에 중점을 둡니다.

ASP.NET MVC 5 웹 애플리케이션에서 외부 자격 증명을 사용하려면 Facebook 및 Google OAuth2 및 OpenID 로그온을 사용하여 ASP.NET MVC 5 앱 만들기를 참조하세요.

수백만 명의 사용자가 이미 이러한 외부 공급자와 계정을 가지고 있기 때문에 웹 사이트에서 이러한 자격 증명을 사용하도록 설정하면 상당한 이점이 있습니다. 이러한 사용자는 새 자격 증명 집합을 만들고 기억할 필요가 없는 경우 사이트에 등록하는 경향이 더 높을 수 있습니다. 또한 사용자가 이러한 공급자 중 하나를 통해 로그인한 후 공급자의 소셜 작업을 통합할 수 있습니다.

빌드할 내용

이 자습서에는 두 가지 기본 목표가 있습니다.

  1. 사용자가 OAuth 공급자의 자격 증명으로 로그인할 수 있도록 설정합니다.
  2. 공급자에서 계정 정보를 검색하고 해당 정보를 사이트의 계정 등록과 통합합니다.

이 자습서의 예제에서는 Facebook을 인증 공급자로 사용하는 데 중점을 두지만 공급자를 사용하도록 코드를 수정할 수 있습니다. 공급자를 구현하는 단계는 이 자습서에서 볼 수 있는 단계와 매우 유사합니다. 공급자의 API 집합을 직접 호출할 때만 상당한 차이가 발생합니다.

사전 요구 사항

또는

또한 이 항목에서는 ASP.NET MVC 및 Visual Studio에 대한 기본 지식이 있다고 가정합니다. ASP.NET MVC 4에 대한 소개가 필요한 경우 ASP.NET MVC 4 소개를 참조하세요.

프로젝트 만들기

Visual Studio에서 새 ASP.NET MVC 4 웹 애플리케이션을 만들고 이름을 "OAuthMVC"로 지정합니다. .NET Framework 4.5 또는 4를 대상으로 지정할 수 있습니다.

프로젝트 만들기

새 ASP.NET MVC 4 프로젝트 창에서 인터넷 애플리케이션 을 선택하고 Razor 를 보기 엔진으로 둡니다.

인터넷 애플리케이션 선택

공급자 사용

인터넷 애플리케이션 템플릿을 사용하여 MVC 4 웹 애플리케이션을 만들 때 프로젝트는 App_Start 폴더에 AuthConfig.cs라는 파일을 사용하여 만들어집니다.

AuthConfig 파일

AuthConfig 파일에는 외부 인증 공급자에 대한 클라이언트를 등록하는 코드가 포함되어 있습니다. 기본적으로 이 코드는 주석 처리되므로 외부 공급자를 사용할 수 없습니다.

public static class AuthConfig
{
    public static void RegisterAuth()
    {
        // To let users of this site log in using their accounts from other sites such as Microsoft, Facebook, and Twitter,
        // you must update this site. For more information visit https://go.microsoft.com/fwlink/?LinkID=252166

        //OAuthWebSecurity.RegisterMicrosoftClient(
        //    clientId: "",
        //    clientSecret: "");

        //OAuthWebSecurity.RegisterTwitterClient(
        //    consumerKey: "",
        //    consumerSecret: "");

        //OAuthWebSecurity.RegisterFacebookClient(
        //    appId: "",
        //    appSecret: "");

        //OAuthWebSecurity.RegisterGoogleClient();
    }
}

외부 인증 클라이언트를 사용하려면 이 코드의 주석 처리를 제거해야 합니다. 사이트에 포함하려는 공급자만 주석 처리를 제거합니다. 이 자습서에서는 Facebook 자격 증명만 사용하도록 설정합니다.

public static class AuthConfig
{
    public static void RegisterAuth()
    {
        //OAuthWebSecurity.RegisterMicrosoftClient(
        //    clientId: "",
        //    clientSecret: "");

        //OAuthWebSecurity.RegisterTwitterClient(
        //    consumerKey: "",
        //    consumerSecret: "");

        OAuthWebSecurity.RegisterFacebookClient(
            appId: "",
            appSecret: "");

        //OAuthWebSecurity.RegisterGoogleClient();        
    }
}

위의 예제에서는 메서드에 등록 매개 변수에 대한 빈 문자열이 포함되어 있습니다. 지금 애플리케이션을 실행하려고 하면 매개 변수에 대해 빈 문자열이 허용되지 않으므로 애플리케이션에서 인수 예외를 throw합니다. 유효한 값을 제공하려면 다음 섹션과 같이 웹 사이트를 외부 공급자에 등록해야 합니다.

외부 공급자에 등록

외부 공급자의 자격 증명으로 사용자를 인증하려면 웹 사이트를 공급자에 등록해야 합니다. 사이트를 등록하면 클라이언트를 등록할 때 포함할 매개 변수(예: 키 또는 ID 및 비밀)를 받게 됩니다. 사용하려는 공급자가 있는 계정이 있어야 합니다.

이 자습서에서는 이러한 공급자에 등록하기 위해 수행해야 하는 모든 단계를 표시하지 않습니다. 단계는 일반적으로 어렵지 않습니다. 사이트를 성공적으로 등록하려면 해당 사이트에 제공된 지침을 따릅니다. 사이트 등록을 시작하려면 개발자 사이트에서 다음을 참조하세요.

Facebook에 사이트를 등록할 때 아래 이미지와 같이 사이트 도메인 및 "http://localhost/" URL에 대해 "localhost"를 제공할 수 있습니다. localhost 사용은 대부분의 공급자에서 작동하지만 현재는 Microsoft 공급자와 작동하지 않습니다. Microsoft 공급자의 경우 유효한 웹 사이트 URL을 포함해야 합니다.

사이트 등록

이전 이미지에서는 앱 ID, 앱 비밀 및 연락처 전자 메일의 값이 제거되었습니다. 실제로 사이트를 등록하면 해당 값이 표시됩니다. 앱 ID 및 앱 비밀에 대한 값을 애플리케이션에 추가하므로 주의해야 합니다.

테스트 사용자 만들기

기존 Facebook 계정을 사용하여 사이트를 테스트하는 데 신경 쓰지 않는 경우 이 섹션을 건너뛸 수 있습니다.

Facebook 앱 관리 페이지 내에서 애플리케이션에 대한 테스트 사용자를 쉽게 만들 수 있습니다. 이러한 테스트 계정을 사용하여 사이트에 로그인할 수 있습니다. 왼쪽 탐색 창에서 역할 링크를 클릭하고 만들기 링크를 클릭하여 테스트 사용자를 만듭니 다.

테스트 사용자 만들기

Facebook 사이트는 사용자가 요청하는 테스트 계정 수를 자동으로 만듭니다.

공급자에서 애플리케이션 ID 및 비밀 추가

이제 Facebook에서 ID와 비밀을 받았으므로 AuthConfig 파일로 돌아가서 매개 변수 값으로 추가합니다. 아래에 표시된 값은 실제 값이 아닙니다.

public static class AuthConfig
{
    public static void RegisterAuth()
    {
        //OAuthWebSecurity.RegisterMicrosoftClient(
        //    clientId: "",
        //    clientSecret: "");

        //OAuthWebSecurity.RegisterTwitterClient(
        //    consumerKey: "",
        //    consumerSecret: "");

        //OAuthWebSecurity.RegisterFacebookClient(
        //    appId: "",
        //    appSecret: "");

        //OAuthWebSecurity.RegisterGoogleClient();
    }
}

외부 자격 증명으로 로그인

즉, 사이트에서 외부 자격 증명을 사용하도록 설정하기 위해 해야 할 일입니다. 애플리케이션을 실행하고 오른쪽 위 모서리에 있는 로그인 링크를 클릭합니다. 이 템플릿은 Facebook을 공급자로 등록했음을 자동으로 인식하고 공급자에 대한 단추를 포함합니다. 여러 공급자를 등록하면 각 공급자에 대한 단추가 자동으로 포함됩니다.

외부 로그인

이 자습서에서는 외부 공급자에 대한 로그인 단추를 사용자 지정하는 방법을 다루지 않습니다. 해당 정보는 OAuth/OpenID를 사용할 때 로그인 UI 사용자 지정을 참조하세요.

Facebook 자격 증명으로 로그인하려면 Facebook 단추를 클릭합니다. 외부 공급자 중 하나를 선택하면 해당 사이트로 리디렉션되고 해당 서비스에서 로그인하라는 메시지가 표시됩니다.

다음 이미지는 Facebook의 로그인 화면을 보여줍니다. Facebook 계정을 사용하여 oauthmvcexample이라는 사이트에 로그인하고 있음을 알 수 있습니다.

facebook 인증

Facebook 자격 증명으로 로그인한 후 페이지는 사이트에 기본 정보에 액세스할 수 있음을 사용자에게 알릴 수 있습니다.

요청 권한

앱으로 이동을 선택한 후 사용자는 사이트에 등록해야 합니다. 다음 이미지는 사용자가 Facebook 자격 증명으로 로그인한 후의 등록 페이지를 보여줍니다. 사용자 이름은 일반적으로 공급자의 이름으로 미리 채워집니다.

스크린샷은 Facebook 계정을 이 앱과 연결할 수 있는 등록 페이지를 보여줍니다.

등록을 클릭하여 등록을 완료합니다. 브라우저를 닫습니다.

새 계정이 데이터베이스에 추가된 것을 볼 수 있습니다. 서버 Explorer DefaultConnection 데이터베이스를 열고 Tables 폴더를 엽니다.

데이터베이스 테이블

UserProfile 테이블을 마우스 오른쪽 단추로 클릭하고 테이블 데이터 표시를 선택합니다.

데이터 표시

추가한 새 계정이 표시됩니다. webpage_OAuthMembership 테이블의 데이터를 확인합니다. 방금 추가한 계정에 대해 외부 공급자와 관련된 더 많은 데이터가 표시됩니다.

외부 인증만 사용하도록 설정하려는 경우 완료됩니다. 그러나 다음 섹션과 같이 공급자의 정보를 새 사용자 등록 프로세스에 추가로 통합할 수 있습니다.

추가 사용자 정보를 위한 모델 만들기

이전 섹션에서 알 수 있듯이 기본 제공 계정 등록이 작동하도록 추가 정보를 검색할 필요가 없습니다. 그러나 대부분의 외부 공급자는 사용자에 대한 추가 정보를 다시 전달합니다. 다음 섹션에서는 해당 정보를 보존하고 데이터베이스에 저장하는 방법을 보여줍니다. 특히 사용자의 전체 이름, 사용자의 개인 웹 페이지의 URI 및 Facebook에서 계정을 확인했는지 여부를 나타내는 값을 유지합니다.

Code First 마이그레이션 사용하여 추가 사용자 정보를 저장하기 위한 테이블을 추가합니다. 기존 데이터베이스에 테이블을 추가하므로 먼저 현재 데이터베이스의 스냅샷 만들어야 합니다. 현재 데이터베이스의 스냅샷 만들면 나중에 새 테이블만 포함하는 마이그레이션을 만들 수 있습니다. 현재 데이터베이스의 스냅샷 만들려면 다음을 수행합니다.

  1. 패키지 관리자 콘솔 열기
  2. 명령 enable-migrations 실행
  3. 명령 추가 마이그레이션 초기 실행 –IgnoreChanges
  4. update-database 명령 실행

이제 새 속성을 추가합니다. Models 폴더에서 AccountModels.cs 파일을 열고 RegisterExternalLoginModel 클래스를 찾습니다. RegisterExternalLoginModel 클래스는 인증 공급자에서 반환되는 값을 보유합니다. 아래에 강조 표시된 대로 FullName 및 Link라는 속성을 추가합니다.

public class RegisterExternalLoginModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    public string ExternalLoginData { get; set; }

    [Display(Name = "Full name")]
    public string FullName { get; set; }

    [Display(Name = "Personal page link")]
    public string Link { get; set; }
}

또한 AccountModels.cs에서 ExtraUserInformation이라는 새 클래스를 추가합니다. 이 클래스는 데이터베이스에 만들어질 새 테이블을 나타냅니다.

[Table("ExtraUserInformation")]
public class ExternalUserInformation
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public string FullName { get; set; }
    public string Link { get; set; }
    public bool? Verified { get; set; }
}

UsersContext 클래스에서 아래에 강조 표시된 코드를 추가하여 새 클래스에 대한 DbSet 속성을 만듭니다.

public class UsersContext : DbContext
{
    public UsersContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<UserProfile> UserProfiles { get; set; }
    public DbSet<ExternalUserInformation> ExternalUsers { get; set; }
}

이제 새 테이블을 만들 준비가 되었습니다. 패키지 관리자 콘솔을 다시 열고 이번에는 다음을 수행합니다.

  1. Add-migration AddExtraUserInformation 명령을 실행합니다.
  2. update-database 명령 실행

이제 새 테이블이 데이터베이스에 있습니다.

추가 데이터 검색

두 가지 방법으로 추가 사용자 데이터를 검색할 수 있습니다. 첫 번째 방법은 인증 요청 중에 기본적으로 다시 전달되는 사용자 데이터를 유지하는 것입니다. 두 번째 방법은 공급자 API를 구체적으로 호출하고 자세한 정보를 요청하는 것입니다. FullName 및 Link에 대한 값은 Facebook에서 자동으로 다시 전달됩니다. Facebook이 Facebook API 호출을 통해 계정을 검색했는지 여부를 나타내는 값입니다. 먼저 FullName 및 Link에 대한 값을 채웁니다. 그런 다음 나중에 확인된 값을 가져옵니다.

추가 사용자 데이터를 검색하려면 Controllers 폴더에서 AccountController.cs 파일을 엽니다.

이 파일에는 계정 로깅, 등록 및 관리에 대한 논리가 포함되어 있습니다. 특히 ExternalLoginCallbackExternalLoginConfirmation이라는 메서드를 확인합니다. 이러한 메서드 내에서 코드를 추가하여 애플리케이션에 대한 외부 로그인 작업을 사용자 지정할 수 있습니다. ExternalLoginCallback 메서드의 첫 번째 줄에는 다음이 포함됩니다.

AuthenticationResult result = OAuthWebSecurity.VerifyAuthentication(
    Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl }));

추가 사용자 데이터는 VerifyAuthentication 메서드에서 반환되는 AuthenticationResult 개체의 ExtraData 속성에 다시 전달됩니다. Facebook 클라이언트는 ExtraData 속성에 다음 값을 포함합니다.

  • id
  • name
  • link
  • gender
  • accesstoken

다른 공급자는 ExtraData 속성에서 유사하지만 약간 다른 데이터를 갖습니다.

사용자가 사이트를 새로 사용하는 경우 일부 추가 데이터를 검색하고 해당 데이터를 확인 보기에 전달합니다. 메서드의 마지막 코드 블록은 사용자가 사이트를 새로 사용하는 경우에만 실행됩니다. 다음 줄을 바꿉니다.

return View("ExternalLoginConfirmation", new RegisterExternalLoginModel 
{ 
    UserName = result.UserName, 
    ExternalLoginData = loginData 
});

다음 줄로 바꿉니다.

return View("ExternalLoginConfirmation", new RegisterExternalLoginModel
{
    UserName = result.UserName,
    ExternalLoginData = loginData,
    FullName = result.ExtraData["name"],
    Link = result.ExtraData["link"]
});

이 변경 내용에는 FullName 및 Link 속성에 대한 값만 포함됩니다.

ExternalLoginConfirmation 메서드에서 아래 강조 표시된 대로 코드를 수정하여 추가 사용자 정보를 저장합니다.

if (user == null)
{
    // Insert name into the profile table
    UserProfile newUser = db.UserProfiles.Add(new UserProfile { UserName = model.UserName });
    db.SaveChanges();

    db.ExternalUsers.Add(new ExternalUserInformation 
    { 
        UserId = newUser.UserId, 
        FullName = model.FullName, 
        Link = model.Link 
    });
    db.SaveChanges();

    OAuthWebSecurity.CreateOrUpdateAccount(provider, providerUserId, model.UserName);
    OAuthWebSecurity.Login(provider, providerUserId, createPersistentCookie: false);

    return RedirectToLocal(returnUrl);
}
else
{
    ModelState.AddModelError("UserName", "User name already exists. Please enter a different user name.");
}

보기 조정

공급자에서 검색하는 추가 사용자 데이터가 등록 페이지에 표시됩니다.

Views/Account 폴더에서 ExternalLoginConfirmation.cshtml을 엽니다. 사용자 이름에 대한 기존 필드 아래에 FullName, Link 및 PictureLink에 대한 필드를 추가합니다.

<li>
    @Html.LabelFor(m => m.FullName)
    @Html.TextBoxFor(m => m.FullName)
</li>
<li>
    @Html.LabelFor(m => m.Link)
    @Html.TextBoxFor(m => m.Link)
</li>

이제 애플리케이션을 실행하고 저장된 추가 정보를 사용하여 새 사용자를 등록할 준비가 되었습니다. 사이트에 아직 등록되지 않은 계정이 있어야 합니다. 다른 테스트 계정을 사용하거나 다시 사용하려는 계정에 대한 UserProfilewebpages_OAuthMembership 테이블의 행을 삭제할 수 있습니다. 이러한 행을 삭제하면 계정이 다시 등록됩니다.

애플리케이션을 실행하고 새 사용자를 등록합니다. 이번에는 확인 페이지에 더 많은 값이 포함되어 있습니다.

Facebook 계정을 앱과 연결한 후 사용자 이름 및 기타 정보를 입력할 수 있는 위치를 보여 주는 스크린샷

등록을 완료한 후 브라우저를 닫습니다. 데이터베이스에서 ExtraUserInformation 테이블의 새 값을 확인합니다.

Facebook API용 NuGet 패키지 설치

Facebook은 작업을 수행하기 위해 호출할 수 있는 API 를 제공합니다. HTTP 요청을 보내거나 이러한 요청을 쉽게 보낼 수 있는 NuGet 패키지를 설치하여 Facebook API를 호출할 수 있습니다. NuGet 패키지 사용은 이 자습서에 나와 있지만 NuGet 패키지를 설치하는 것은 필수가 아닙니다. 이 자습서에서는 Facebook C# SDK 패키지를 사용하는 방법을 보여줍니다. Facebook API 호출을 지원하는 다른 NuGet 패키지가 있습니다.

NuGet 패키지 관리 창에서 Facebook C# SDK 패키지를 선택합니다.

패키지 설치

Facebook C# SDK를 사용하여 사용자에 대한 액세스 토큰이 필요한 작업을 호출합니다. 다음 섹션에서는 액세스 토큰을 가져오는 방법을 보여줍니다.

액세스 토큰 검색

대부분의 외부 공급자는 사용자의 자격 증명이 확인된 후 액세스 토큰을 다시 전달합니다. 이 액세스 토큰은 인증된 사용자만 사용할 수 있는 작업을 호출할 수 있기 때문에 매우 중요합니다. 따라서 더 많은 기능을 제공하려는 경우 액세스 토큰을 검색하고 저장하는 것이 필수적입니다.

외부 공급자에 따라 액세스 토큰은 제한된 시간 동안만 유효할 수 있습니다. 유효한 액세스 토큰이 있는지 확인하려면 사용자가 로그인할 때마다 검색하여 데이터베이스에 저장하지 않고 세션 값으로 저장합니다.

ExternalLoginCallback 메서드에서 액세스 토큰은 AuthenticationResult 개체의 ExtraData 속성에도 다시 전달됩니다. ExternalLoginCallback에 강조 표시된 코드를 추가하여 Session 개체에 액세스 토큰을 저장합니다. 이 코드는 사용자가 Facebook 계정으로 로그인할 때마다 실행됩니다.

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

    if (result.ExtraData.Keys.Contains("accesstoken"))
    {
        Session["facebooktoken"] = result.ExtraData["accesstoken"];
    }

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

    if (User.Identity.IsAuthenticated)
    {
        // If the current user is logged in add the new account
        OAuthWebSecurity.CreateOrUpdateAccount(
            result.Provider,
            result.ProviderUserId, 
            User.Identity.Name);
        return RedirectToLocal(returnUrl);
    }
    else
    {
        // User is new, ask for their desired membership name
        string loginData = OAuthWebSecurity.SerializeProviderUserId(
            result.Provider, 
            result.ProviderUserId);
        ViewBag.ProviderDisplayName =
            OAuthWebSecurity.GetOAuthClientData(result.Provider).DisplayName;
        ViewBag.ReturnUrl = returnUrl;
        return View("ExternalLoginConfirmation", new RegisterExternalLoginModel
        {
            UserName = result.UserName,
            ExternalLoginData = loginData,
            FullName = result.ExtraData["name"],
            Link = result.ExtraData["link"]
        });    
    }
}

이 예제에서는 Facebook에서 액세스 토큰을 검색하지만 "accesstoken"이라는 동일한 키를 통해 외부 공급자에서 액세스 토큰을 검색할 수 있습니다.

로그오프

기본 LogOff 메서드는 사용자를 애플리케이션에서 로그아웃하지만 외부 공급자에서 사용자를 로그아웃하지는 않습니다. Facebook에서 사용자를 로그아웃하고 사용자가 로그오프한 후 토큰이 유지되지 않도록 하려면 다음 강조 표시된 코드를 AccountController의 LogOff 메서드에 추가할 수 있습니다.

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
    WebSecurity.Logout();
    if (Session["facebooktoken"] != null)
    {
        var fb = new Facebook.FacebookClient();
        string accessToken = Session["facebooktoken"] as string;
        var logoutUrl = fb.GetLogoutUrl(new { access_token = accessToken, next = "http://localhost:39852/" });

        Session.RemoveAll();
        return Redirect(logoutUrl.AbsoluteUri);
    }

    return RedirectToAction("Index", "Home");
}

매개 변수에 제공하는 값은 사용자가 Facebook에서 next 로그아웃한 후 사용할 URL입니다. 로컬 컴퓨터에서 테스트할 때 로컬 사이트에 올바른 포트 번호를 제공합니다. 프로덕션 환경에서는 contoso.com 같은 기본 페이지를 제공합니다.

액세스 토큰이 필요한 사용자 정보 검색

이제 액세스 토큰을 저장하고 Facebook C# SDK 패키지를 설치했으므로 함께 사용하여 Facebook에서 추가 사용자 정보를 요청할 수 있습니다. ExternalLoginConfirmation 메서드에서 액세스 토큰의 값을 전달하여 FacebookClient 클래스의 instance 만듭니다. 인증된 현재 사용자에 대해 확인된 속성의 값을 요청합니다. 확인된 속성은 Facebook이 휴대폰으로 메시지 보내기와 같은 다른 방법을 통해 계정의 유효성을 검사했는지 여부를 나타냅니다. 데이터베이스에 이 값을 저장합니다.

if (user == null)
{
    // Insert name into the profile table
    UserProfile newUser = db.UserProfiles.Add(new UserProfile { UserName = model.UserName });
    db.SaveChanges();

    bool facebookVerified;

    var client = new Facebook.FacebookClient(Session["facebooktoken"].ToString());
    dynamic response = client.Get("me", new { fields = "verified" });
    if (response.ContainsKey("verified"))
    {
        facebookVerified = response["verified"];
    }
    else
    {
        facebookVerified = false;
    }

    db.ExternalUsers.Add(new ExternalUserInformation 
    { 
        UserId = newUser.UserId, 
        FullName = model.FullName, 
        Link = model.Link, 
        Verified = facebookVerified 
    });
    db.SaveChanges();

    OAuthWebSecurity.CreateOrUpdateAccount(provider, providerUserId, model.UserName);
    OAuthWebSecurity.Login(provider, providerUserId, createPersistentCookie: false);

    return RedirectToLocal(returnUrl);
}

사용자에 대한 데이터베이스의 레코드를 다시 삭제하거나 다른 Facebook 계정을 사용해야 합니다.

애플리케이션을 실행하고 새 사용자를 등록합니다. ExtraUserInformation 테이블을 확인하여 Verified 속성의 값을 확인합니다.

결론

이 자습서에서는 사용자 인증 및 등록 데이터를 위해 Facebook과 통합된 사이트를 만들었습니다. MVC 4 웹 애플리케이션에 대해 설정된 기본 동작과 해당 기본 동작을 사용자 지정하는 방법에 대해 알아보았습니다.