Share via


뱅킹용 Windows 스토어 앱: 코드 연습(JavaScript 및 HTML을 사용하는 Windows 스토어 앱)

이 샘플은 인터넷을 통한 통신 및 보안 인증을 구현하는 간단한 뱅킹용 Windows 스토어 앱을 만드는 방법을 보여 줍니다. 이 샘플의 코드를 사용하여 서버와의 보안 상호 작용이 필요한 Windows 스토어 앱을 만들 수 있습니다.

다음 섹션에서는 보안 인증을 사용하는 뱅킹용 Windows 스토어 앱의 일부분을 설명합니다.

사전 요구 사항

Microsoft Visual Studio Express 2012 for Windows 8

Microsoft Visual Studio Professional 2012

Microsoft Visual Studio Ultimate 2012

개발자 라이선스

참고  뱅킹 앱을 실행하려면 서버와의 통신을 위해 끝점을 제공하는 웹 서비스가 필요합니다. 다음 항목에서는 인증, 인증서 등록 및 인증서 갱신을 위한 System.Web.Mvc 컨트롤러의 구현에 대해 알아봅니다.

다운로드 위치

전체 코드 예제는 다음 위치에서 다운로드합니다. 강력한 인증을 사용하는 뱅킹용 Windows 스토어 앱.

앱 실행

뱅킹용 Windows 스토어 앱은 인증서 기반 인증을 제공하는 기존 뱅킹용 웹앱에 모델링됩니다. 앱을 처음으로 실행하고 계정에 대한 제한된 권한이 부여되는 사용자 이름과 암호로 로그인합니다. 그런 다음 앱을 종료하고 다시 시작합니다. 이때 인증서를 업그레이드할지 선택합니다. 마지막으로 앱을 종료하고 다시 시작합니다. 계정에 로그인을 클릭하면 자격 증명을 입력하지 않고 계정에 대한 모든 권한을 갖게 됩니다.

암호 기반 인증

먼저 다음 단계를 수행합니다.

  • 뱅킹 앱을 시작합니다.

  • 계정에 로그인을 클릭합니다.

  • 비어 있지 않은 문자열일 수 있는 사용자 이름과 암호로 로그인하고 제출을 클릭합니다.

    계정 페이지에 암호 기반 인증으로 인해 액세스가 제한된다는 메시지가 표시됩니다.

인증서 기반 인증으로 업그레이드

사용자 이름/암호 인증에서 인증서 기반 인증으로 업그레이드하면 계정에 모든 권한이 부여됩니다.

  • 앱을 닫고 다시 시작합니다.

  • 강력한 인증으로 업그레이드를 클릭합니다.

  • 업그레이드할지 묻고 업그레이드의 이점을 설명하는 메시지가 표시됩니다.

  • **Server-generated key (PFX install)(서버에서 생성된 키(PFX 설치))**를 선택하고 를 클릭합니다.

    앱은 인증서를 등록하고 사용자를 인증합니다.

인증서 기반 인증을 사용하여 계정 액세스

앱을 종료합니다. 앱을 다시 시작하면 로그인할 때 사용자 이름과 암호를 입력하지 않아도 됩니다.

  • 앱을 다시 시작하고 계정에 로그인을 클릭합니다.

    앱별 인증서를 사용할 수 있으므로 해당 인증서가 인증에 사용됩니다. 인증서를 확인하는 대화 상자가 표시됩니다. 인증되면 계정 페이지에 모든 권한을 가지고 있다고 표시됩니다.

목표: 안전한 사용자 로그인 자격 증명 저장

PasswordVault를 사용하여 Windows 스토어 앱에 사용자 이름과 암호 자격 증명을 안전하게 저장할 수 있습니다.

목표: 보안 앱을 위한 매니페스트 설정

앱의 패키지 매니페스트를 편집하여 Windows 스토어에 대한 기능 및 인증서를 지정합니다.

목표: 서버 로그인

뱅킹용 Windows 스토어 앱에서는 온라인 뱅킹 세션에 대한 사용자 로그인 처리 방법을 보여 줍니다. 서버는 사용자의 인증서를 확인하고 앱은 그 결과를 기반으로 해당 페이지를 표시합니다.

목표: 인증서 요청

클라이언트에서 생성된 키 또는 서버에서 생성된 키를 가진 인증서를 요청하도록 선택할 수 있습니다. 뱅킹용 Windows 스토어 앱은 createRequestAsyncimportPfxDataAsync 함수를 사용하여 두 가지 방법을 보여 줍니다.

목표: 인증서 갱신

새 인증서를 요청하는 것만큼 쉽게 클라이언트에서 생성된 키 또는 서버에서 생성된 키를 가진 인증서를 갱신할 수 있습니다. 뱅킹용 Windows 스토어 앱은 createRequestAsyncimportPfxDataAsync 함수를 사용하여 두 가지 방법을 보여 줍니다.

패키지 설정 및 앱 매니페스트

package.appxmanifest 또는 AppxManifest.xml이라는 앱 매니페스트 파일을 편집하여 Windows 스토어 앱의 배포를 제어합니다. Visual Studio Express 2012 for Windows 8을 사용하여 매니페스트 파일에 설정을 적용하거나, 파일을 직접 편집할 수 있습니다.

솔루션 탐색기에서 package.appxmanifest를 두 번 클릭하여 매니페스트 디자이너를 엽니다.

패키지 설정: 앱 UI 속성

응용 프로그램 UI 페이지에는 다음 속성이 아래와 같이 설정되어 있습니다.

속성
시작 페이지 default.html
표시 이름 모든 로고
짧은 이름 TBA
전경 텍스트 어둡게
배경색 #000000
잠금 화면 알림 (설정 안 됨)
초기 회전 세로

 

패키지 설정: 앱 기능

기능 페이지에는 인터넷(클라이언트) 및 **개인 네트워크(클라이언트 및 서버)**가 선택되어 있습니다. 공유 인증서를 사용하려면 공유 사용자 인증서가 선택되어 있는지 확인합니다. 자세한 내용은 인증서 저장소 기능 설정을 참조하세요.

참고  뱅킹 앱에서 스마트 카드를 사용하려면 앱 매니페스트에서 sharedUserCertificates 기능을 지정해야 합니다.

다음 예제는 앱 매니페스트에 앱의 기능을 선언하는 방법을 보여 줍니다. 코드는 package.appxmanifest에 있습니다.

<Capabilities>
   <Capability Name="privateNetworkClientServer" />
   <Capability Name="internetClient" />
<!--   <Capability Name="sharedUserCertificates"/>-->
 </Capabilities>

패키지 설정: 인증서 선언

인증서 선언을 사용하여 신뢰할 수 있는 루트 인증서 및 기타 디지털 인증서를 할당합니다. 다음 절차는 선언 디자이너를 사용하여 새 루트 인증서를 추가하는 방법을 설명합니다. 자세한 내용은 매니페스트를 사용하여 인증서 설치를 참조하세요.

인증서지원되는 선언에 표시되지 않으면 다음 단계를 사용하여 루트 인증서를 추가합니다.

  • 선언 페이지를 엽니다.

  • 사용 가능한 선언 드롭다운 목록에서 인증서를 선택하고 추가를 클릭합니다.

    인증서 디자이너가 열립니다.

  • 신뢰 플래그에서 제외 신뢰가 선택되어 있는지 확인합니다.

  • 선택 조건에서 자동 선택이 선택되어 있는지 확인합니다.

  • 인증서에서 새로 추가를 클릭합니다.

  • 저장소 이름 입력란에 Root를 입력합니다.

  • 콘텐츠 입력란에 myroot.cer을 입력합니다.

다음 예제는 루트 및 개발자 인증서 할당 방법을 보여 줍니다. 코드는 package.appxmanifest에 있습니다.

<Extensions>
   <Extension Category="windows.certificates">
     <Certificates>
       <Certificate StoreName="Root" Content="myroot.cer" />
       <Certificate StoreName="CA" Content="mystandca.cer" />
       <TrustFlags ExclusiveTrust="true" />
       <SelectionCriteria AutoSelect="true" />
     </Certificates>
   </Extension>
 </Extensions>

패키지 설정: 패키징 속성

패키징 페이지에서 패키지 이름Microsoft.SDKSamples.TailoredBankAppShare로 설정하고 패키지 표시 이름TailoredBankAppShare SDK Sample로 설정합니다.

사용자 이름과 암호를 사용하여 서버에 로그인합니다.

PasswordVault를 사용하여 보안 응용 프로그램에 대한 암호 자격 증명을 저장하고 검색합니다. 최상의 보안을 위해, 뱅킹 앱은 사용자가 인증서 기반 인증으로 업그레이드하도록 권장합니다.

다음 예제에서는 사용자 이름과 암호 자격 증명을 사용하여 보안 앱에 대한 로그인을 구현하는 방법을 보여 줍니다. 코드는 scenario0.js에 있습니다.

//account logon
// onClick() handler for the 'submitButton'
function logon() {
    try {
        var username = document.getElementById("username").value;
        var password = document.getElementById("password").value;

        //store user credential in the vault component
        if (username && password) {
            var cred = new Windows.Security.Credentials.PasswordCredential("WoodGrove-Bank-usercred", username, password);
            var vault = new Windows.Security.Credentials.PasswordVault();
            vault.add(cred);
        }else {
            return false;
        }
    }
    catch (err) {
        var message = '';
        for (var f in err) {
            message += f;
            message += ':';
            message += err[f];
            message += ' ';
        }
        goError(message);
        return false;
    }

    var params = "UserName=" + username;
    params += "&Password=" + password;

    WinJS.xhr({
        type: "POST",
        url: "Your URL",    //Please provide the server url here. For example:
                            //url: "https://WoodGrove-Bank/bankserver2/account/simplelogon",
        headers: { "Content-type": "application/x-www-form-urlencoded" },
        data: params
    }).then(
        function (request) {
            var obtainedData = window.JSON.parse(request.responseText);
            var /*@override*/ item = {
                title: "Account Page",
                content: "<strong>(Please upgrade to strong authentication if you need full access to your account.)",
                backgroundColor: 'rgba(25,50,200,1)',
                navigate: "groupeditemsPage"
            };
            WinJS.Navigation.navigate('/html/account.html', { item: item });
        },
        function (request) {
            goError("(The error was: <strong>" + request.message + "</strong>) <br>" 
                    + "The server URL you are using may not be valid. <br>"
                    + "Please contact your bank server service, "
                    + "or refer to the bank server walk through document for instructions to setup your own server.");
            return false;
        }
    );
};

사용자 이름과 암호는 PasswordVault에 추가되며 xhr 함수를 사용하여 웹 서비스의 simplelogon 끝점으로 보내집니다. 요청에 성공하면 account.html이 표시됩니다.

인증서 요청 및 등록

최상의 보안을 위해, 뱅킹 앱은 사용자가 인증서 기반 인증으로 업그레이드하도록 권장합니다. 클라이언트 앱에서 인증서 요청을 만들거나, 서버에서 PFX(개인 정보 교환) 인증서를 가져올 수 있습니다. 두 경우 모두 CertificateEnrollmentManager 개체를 사용하여 등록합니다.

서버에 인증서 요청 제출

Windows 스토어 앱은 Microsoft 인증서 서비스를 실행하여 인증 기관에 인증서 요청을 제출할 수 있고, 개발자는 CertificateEnrollmentManager를 사용하여 발급된 인증서를 설치할 수 있습니다. 자세한 내용은 인증서 요청 제출 및 인증서 응답 설치를 참조하세요.

다음 예제에서는 클라이언트에서 생성된 키를 가진 인증서를 요청하는 방법을 보여 줍니다. 코드는 enrollment.js에 있습니다.

//pkcs10 certification enrollment
function createRequestBlobAndEnroll(user)
{
    var encoded;
    try {
        //WinRT APIs for creating a certficate request
        var request = new Windows.Security.Cryptography.Certificates.CertificateRequestProperties;
        request.subject = user;
        request.friendlyName = user + "'s WoodGrove Bank Certificate";
        request.keyProtectionLevel = Windows.Security.Cryptography.Certificates.KeyProtectionLevel.noConsent;
        Windows.Security.Cryptography.Certificates.CertificateEnrollmentManager.createRequestAsync(request).then(
            function (requestResult) {
                encoded = requestResult;
                   var installOption = 0; //Windows.Security.Cryptography.Certificates.InstallOptions.none;
                var params = "username=" + user;
                params += "&request=" + encodeURIComponent(encoded);
            
                WinJS.xhr({
                    type: "POST",
                    url: "Your URL",    //Please provide the server url here. For example:
                                        //url: "https://WoodGrove-Bank/bankserver2/enrollment/submit",
                    headers: { "Content-type": "application/x-www-form-urlencoded" },
                    data: params
                }).then(
                    function (/*@override*/request) {
                        var obtainedData = window.JSON.parse(request.responseText);
                        try {
                            // WinRT API for certficate enrollment
                            Windows.Security.Cryptography.Certificates.CertificateEnrollmentManager
                                .installCertificateAsync(obtainedData.certificate, installOption ).then(
                            function() {
                                // set certificate enrollment mark to aviod redundant certificate enrollments
                                Windows.Storage.ApplicationData.current.localSettings.values["EnrollCertificate"] = true;

                                var /*@override*/ item = {
                                        title: "Account Page",
                                        content: 
"<strong>(Please sign out and re-launch the application so as to use your enrolled certificate.)<strong>",
                                        backgroundColor: 'rgba(191, 84, 46, 1)',
                                        navigate: "sign-out"
                                };
                                WinJS.Navigation.navigate('/html/account.html', { item: item });
                                return false;
                            },
                            function(installError) {
                                gotoError("(The error was: <strong>" + intallError.message + "</strong>)");
                                return false;
                            });
                        } catch (err) {
                            var /*@override*/ message = '';
                            for (var /*@override*/ f in err) {
                            message += f;
                            message += ':';
                            message += err[f];
                            message += ' ';
                        }
                            goError(message);
                            return false;
                        }
                    },
                    function (/*@override*/request) {
                        goError("(The error was: <strong>" + request.message + "</strong>) <br>" 
                        + "The server URL you are using may not be valid. <br>"
                        + "Please contact your bank server service, "
                        + "or refer to the bank server topic for instructions to setup your own server.");
                        return false;
                    });
            },
            function (requestError) {
                gotoError("(The error was: <strong>" + requestError.message + "</strong>)");
                return false;
            });
    }
    catch (err) {
        var message = '';
        for (var f in err) {
            message += f;
            message += ':';
            message += err[f];
            message += ' ';
        }
        goError(message);
        return false;
    };
}

createRequestBlobAndEnroll 함수는 CertificateEnrollmentManager 개체를 사용하여 인증서 요청을 생성하고 이를 서버에 전송합니다. 요청에 성공하면 installCertificateAsync 함수가 제공된 인증서를 설치합니다.

클라이언트에서 제공된 키를 사용한 갱신

Windows 8에서는 오래된 인증서를 제외하므로, 인증서 갱신은 인증서를 처음 설치하는 과정과 본질적으로 동일합니다.

다음 예제에서는 클라이언트에서 생성된 키를 가진 인증서를 요청하는 방법을 보여 줍니다. 코드는 groupedItemsPage.js에 있습니다.

//pkcs10 certificate renewal
function createRequestBlobAndEnroll(user) {
    var encoded;
    try {
        //WinRT APIs for creating a certficate request
        var request = new Windows.Security.Cryptography.Certificates.CertificateRequestProperties;
        request.subject = user;
        request.friendlyName = user + "'s WoodGrove Bank Certificate";
        request.keyProtectionLevel = Windows.Security.Cryptography.Certificates.KeyProtectionLevel.noConsent;
        Windows.Security.Cryptography.Certificates.CertificateEnrollmentManager.createRequestAsync(request).then(
            function (requestResult) {
                encoded = requestResult;
                // No username or password required in this case - we already have a
                // client-authenticated SSL connection
                var installOption = 0; //Windows.Security.Cryptography.Certificates.InstallOptions.none;
                var params = "request=" + encodeURIComponent(encoded);
                WinJS.xhr({
                    type: "POST",
                    url: "Your URL",    //Please provide the server url here. For example:
                                        //url: "https://WoodGrove-Bank/bankserver2/renewal/renewP10",
                    headers: { "Content-type": "application/x-www-form-urlencoded" },
                    data: params
                }).then(
                    function (/*@override*/request) {
                        var obtainedData = window.JSON.parse(request.responseText);
                        // We do not need to remove the previous certificate first -
                        // Win8 filtering will take care of it.
                        try {
                            Windows.Security.Cryptography.Certificates.CertificateEnrollmentManager
                                .installCertificateAsync(obtainedData.certificate, installOption).then(
                            function () {
                                var /*@override*/ item = {
                                    title: "Account Page",
                                    content: "",
                                    backgroundColor: 'rgba(25,50,200,1)',
                                    navigate: "sign-out"
                                };
                                WinJS.Navigation.navigate('/html/account.html', { item: item });
                            },
                            function (installError) {
                                gotoError("(The error was: <strong>" + intallError.message + "</strong>)");
                                return false;
                            });
                        } catch (err) {
                            var /*@override*/ message = '';
                            for (var /*@override*/ f in err) {
                                message += f;
                                message += ':';
                                message += err[f];
                                message += ' ';
                            };
                            goError(message);
                            return false;
                        };
                    },
                    function (/*@override*/request) {
                        goError("(The error was: <strong>" + request.message + "</strong>) <br>" 
                        + "The server URL you are using may not be valid. <br>"
                        + "Please contact your bank server service, "
                        + "or refer to the bank server walk through document for instructions to setup your own server.");
                        return false;
                    });
            },
            function (requestError) {
                gotoError("(The error was: <strong>" + requestError.message + "</strong>)");
                return false;
            });
    }
    catch (err) {
        var message = '';
        for (var f in err) {
            message += f;
            message += ':';
            message += err[f];
            message += ' ';
        }
        goError(message);
        return false;
    };
}

createRequestBlobAndEnroll 함수는 CertificateEnrollmentManager 개체를 사용하여 인증서 요청을 생성하고 이를 서버에 전송합니다. 요청에 성공하면 installCertificateAsync 함수가 제공된 인증서를 설치합니다. Windows 8에서 오래된 인증서를 걸러내므로 일부러 제거하지 않아도 됩니다.

인증서 확인

인증서의 상태를 쿼리하고 결과에 따라 다른 페이지를 표시할 수 있습니다.

다음 예제에서는 인증서의 상태를 쿼리하고 결과에 따라 다른 페이지를 표시하는 방법을 보여 줍니다. 코드는 groupedItemsPage.js에 있습니다.

//check certification
function checkCert(senario, scenarioitem) {
    var params = "";
    WinJS.xhr({
        type: "POST",
        url: "Your URL",    //Please provide the server url here. For example:
                            //url: "https://WoodGrove-Bank/bankserver2/renewal/CheckCert",
        headers: { "Content-type": "application/x-www-form-urlencoded" },
        data: params
    }).then(
        function (request) {
            var obtainedData = window.JSON.parse(request.responseText);
            if (obtainedData.hasCert === true) {
                if (obtainedData.renew === true) {
                    if (obtainedData.pfx === true) {
                        doPFXRenewal(obtainedData.user);
                    }
                    else {
                        doPKCS10Renewal(obtainedData.user);
                    }
                }
                else {
                    var /*@override*/ item = {
                        title: "Account Page",
                        content: "",
                        backgroundColor: 'rgba(25,50,200,1)',
                        navigate: "sign-out"
                    };
                    WinJS.Navigation.navigate('/html/account.html', { item: item });
                }
            }
            else {
                switch (senario) {
                    case 0:
                        if (checkCredential()) {
                            var item2 = {
                                title: "Account Page",
                                content: 
"<strong>(Please upgrade to strong authentication if you need full access to your account. <br>"
+ "If you already upgraded to use strong authentication, please sign out and launch the app again and sign-in.)</strong>",
                                backgroundColor: 'rgba(191, 84, 46, 1)',
                                navigate: "groupeditemsPage"
                            };
                            WinJS.Navigation.navigate('/html/account.html', { item: item2 });
                        } else {
                            WinJS.Navigation.navigate('/html/scenario0.html', { item: scenarioitem });
                        }
                        break;
                    case 1:
                        if (checkCredential() && !checkEnrollment()) {
                            WinJS.Navigation.navigate('/html/enrollment.html', { item: scenarioitem });
                        }
                        else if (!checkEnrollment()) {
                            WinJS.Navigation.navigate('/html/scenario1.html', { item: scenarioitem });
                        }
                        else {
                            var item3 = {
                                title: "Account Page",
                                content: 
"<strong>(You already upgraded to use strong authentication. Please sign out and launch the app again and sign-in.)</strong>",
                                backgroundColor: 'rgba(191, 84, 46, 1)',
                                navigate: "sign-out"
                            };
                            WinJS.Navigation.navigate('/html/account.html', { item: item3 });
                        }
                        break;
                    default:
                        goError("unknown scenario!!!");
                        break;
                }
            }
            return false;
        },
        function (request) {
            goError("(The error was: <strong>" + request.message + "</strong>) <br>" 
                    + "The server URL you are using may not be valid. <br>"
                    + "Please contact your bank server service, "
                    + "or refer to the bank server walk through document for instructions to setup your own server.");
            return false;
        }
    );
}

checkCert 함수는 웹 서비스의 CheckCert 끝점을 쿼리하고 응답을 구문 분석합니다. 응답이 인증서이면 앱은 인증서를 갱신해야 하는지 확인하고, 갱신이 필요한 경우 해당 갱신 함수를 호출합니다. 그렇지 않으면 강력하게 인증된 계정 페이지가 표시됩니다.

인증서 기반 인증으로 업그레이드

최상의 보안을 위해, 뱅킹 앱은 사용자가 인증서 기반 인증으로 업그레이드하도록 권장합니다. 클라이언트 앱에서 인증서 요청을 만들거나, 서버에서 PFX(개인 정보 교환) 인증서를 가져올 수 있습니다. 두 경우 모두 CertificateEnrollmentManager 개체를 사용하여 등록합니다.

서버에서 PFX 인증서 가져오기

다음 예제에서는 서버에서 PFX 인증서를 가져오는 방법을 보여 줍니다. 코드는 enrollment.js에 있습니다.

// pfx certificate enrollment
function doPFXEnrollment(user) {

    var exportable = Windows.Security.Cryptography.Certificates.ExportOption.exportable;
    var consent = Windows.Security.Cryptography.Certificates.KeyProtectionLevel.noConsent;
    var installOption = 0; //Windows.Security.Cryptography.Certificates.InstallOptions.none;
    var params = "username=" + user;

    WinJS.xhr({
        type: "POST",
        url: "Your URL",    //Please provide the server url here. For example:
                            //url: "https://WoodGrove-Bank/bankserver2/enrollment/getPFX",
        headers: { "Content-type": "application/x-www-form-urlencoded" },
        data: params
    }).then(
        function (request) {
            var obtainedData = window.JSON.parse(request.responseText);
            try {
                // import pfx certificate file into the app container
                Windows.Security.Cryptography.Certificates.CertificateEnrollmentManager
                    .importPfxDataAsync(obtainedData.pfx, obtainedData.password, exportable, consent, 
                        installOption, obtainedData.friendlyName).then(
                    function () {
                // set certificate enrollment mark to aviod redundant certificate enrollments
                Windows.Storage.ApplicationData.current.localSettings.values["EnrollCertificate"] = true;
                var /*@override*/ item = {
                    title: "Account Page",
                    content: 
"<strong>(Please sign out and re-launch the application so as to use your enrolled certificate.)</strong>",
                    backgroundColor: 'rgba(191, 84, 46, 1)',
                    navigate: "sign-out"
                };
                WinJS.Navigation.navigate('/html/account.html', { item: item });
                return;
                    },
                    function(importError) {
                        gotoError("(The error was: <strong>" + requestError.message + "</strong>)");
                        return false;
                    }); 
            } catch (err) {
                var message = '';
                for (var f in err) {
                    message += f;
                    message += ':';
                    message += err[f];
                    message += ' ';
                }
                goError(message);
                return false;
            }
        },
        function (request) {
            goError("(The error was: <strong>" + request.message + "</strong>) <br>" 
                    + "The server URL you are using may not be valid. <br>"
                    + "Please contact your bank server service, "
                    + "or refer to the bank server walk through document for instructions to setup your own server.");
            return false;
        }
    );
}

doPFXEnrollment 함수는 웹 서비스의 getPFX 끝점에 연결을 시도합니다. 연결되면 CertificateEnrollmentManager 개체는 제공된 인증서를 가져와 클라이언트 컴퓨터에 설치합니다.

PFX 인증서 갱신

Windows 8에서는 오래된 인증서를 제외하므로, PFX(개인 정보 교환) 갱신은 PFX를 처음 설치하는 과정과 본질적으로 동일합니다.

다음 예제에서는 PFX 인증서를 갱신하는 방법을 보여 줍니다. 코드는 groupedItemsPage.js에 있습니다.

//pfx certificate renewal
function doPFXRenewal(user) {
    var exportable = Windows.Security.Cryptography.Certificates.ExportOption.exportable;
    var consent = Windows.Security.Cryptography.Certificates.KeyProtectionLevel.noConsent;
    var installOption = 0; //Windows.Security.Cryptography.Certificates.InstallOptions.none;
    var params = "username=" + user;
    WinJS.xhr({
        type: "POST",
        url: "Your URL",    //Please provide the server url here. For example:
                            //url: "https://WoodGrove-Bank/bankserver2/enrollment/getPFX",
        headers: { "Content-type": "application/x-www-form-urlencoded" },
        data: params
    }).then(
        function (request) {
            var obtainedData = window.JSON.parse(request.responseText);
            // We do not need to remove the previous certificate first -
            // Win8 filtering will take care of it.
            try {
                // No need to remove old cert, Windows will filter.
                Windows.Security.Cryptography.Certificates.CertificateEnrollmentManager
                    .importPfxDataAsync(obtainedData.pfx, obtainedData.password, exportable, consent, 
                        installOption, obtainedData.friendlyName).then(
                    function () {
                        var /*@override*/ item = {
                            title: "Account Page",
                            content: "",
                            backgroundColor: 'rgba(25,50,200,1)',
                            navigate: "sign-out"
                        };
                        WinJS.Navigation.navigate('/html/account.html', { item: item });
                    },
                    function (importError) {
                        gotoError("(The error was: <strong>" + importError.message + "</strong>)");
                        return false;
                    });
            } catch (err) {
                var message = '';
                for (var f in err) {
                    message += f;
                    message += ':';
                    message += err[f];
                    message += ' ';
                };
                goError(message);
                return false;
            }

        },
        function (request) {
            goError("(The error was: <strong>" + request.message + "</strong>) <br>" 
                    + "The server URL you are using may not be valid. <br>"
                    + "Please contact your bank server service, "
                    + "or refer to the bank server walk through document for instructions to setup your own server.");
            return false;
        }
    );
}

doPFXRenewal 함수는 PFX 인증서에 대해 서버에 요청을 게시합니다. 성공할 경우 importPfxDataAsync 함수는 제공된 인증서를 가져와 클라이언트 컴퓨터에 설치합니다. Windows 8에서 오래된 인증서를 걸러내므로 일부러 제거하지 않아도 됩니다.

관련 항목

CertificateEnrollmentManager

PasswordVault

인증서 작업

뱅킹용 Windows 스토어 앱 만들기

뱅킹용 Windows 스토어 앱 만들기: 리소스