2013-07-30 30 views
5

Tôi đang sử dụng PasswordVault để lưu trữ thông tin xác thực người dùng trong ứng dụng windows 8 của tôi.Kiểm tra xem Trình quản lý thông tin xác thực/mật khẩu có dữ liệu ứng dụng tại tải

Điều tôi muốn ứng dụng thực hiện khi tải là kiểm tra xem Trình quản lý thông tin xác thực/mật khẩu đã có giá trị được lưu trữ cho ứng dụng của tôi chưa. nếu nó không không, tôi muốn nó ở lại trên trang để người dùng có thể đăng nhập, nhưng nếu thông tin đăng nhập đã có thì tôi muốn nó đi thẳng đến trang 2.

Tôi đã thử sử dụng như sau mã:

private Windows.Security.Credentials.PasswordCredential GetCredentialFromLocker() 
{ 
    Windows.Security.Credentials.PasswordCredential credential = null; 

    var vault = new Windows.Security.Credentials.PasswordVault(); 

    var credentialList = vault.FindAllByResource("MYapp"); 
    if (credentialList.Count > 0) 
     if (credentialList.Count == 1) 
      credential = credentialList[0]; 
     else 
      // User selecor 

    return credential; 
} 

và sau đó vào tải trang tôi có

private void Page_Loaded(object sender, RoutedEventArgs e) 
{ 
    var loginCredential = GetCredentialFromLocker(); 

    if (loginCredential != null) 
     this.Frame.Navigate(typeof(page2)); 
    else 
    { 
     loginBigButton.Visibility = Windows.UI.Xaml.Visibility.Visible; 
     signUpButton.Visibility = Windows.UI.Xaml.Visibility.Visible; 
     signUpTextBlock.Visibility = Windows.UI.Xaml.Visibility.Visible; 
    } 
} 

vấn đề là nếu không có chứng chỉ lưu trữ với tài nguyên (MyApp) mã:

var credentialList = vault.FindAllByResource("MYapp"); 

sản lượng:

thông tin WinRT: Không thể tìm thấy chứng chỉ trong Vault

thông tin bổ sung: Element không tìm thấy.

Trả lời

2

Phương thức FindAllByResource ném ngoại lệ khi không có thông tin xác thực cho tài nguyên được chỉ định, vì vậy bạn cần phải bọc nó với khối try catch.

Hoặc bạn có thể sử dụng 'RetrieveAll' không loại trừ ngoại lệ nếu không có thông tin đăng nhập được lưu trữ và lặp lại trên mỗi trả lại PasswordCredential và kiểm tra thuộc tính Resource.

+0

cảm ơn bạn đã trả lời nhanh ,,, tôi đã thử đặt thử và nắm bắt nó, như một trong những điều đầu tiên, nhưng nó vẫn ném ngoại lệ .. Sử dụng RetrieveAll làm thế nào tôi sẽ tìm thấy tài sản tài nguyên nó không thể nhìn thấy để làm cho nó hiển thị .. –

+0

lạ, nó sẽ bắt ngoại lệ đó, bạn có thể cập nhật mã của bạn với thử bắt không? Đồng thời kiểm tra http://social.msdn.microsoft.com/Forums/windowsapps/en-US/33101f6c-479f-4828-9093-f7cbe70464d7/exception-trying-to-find-passwordcredential-in-passwordvault –

+0

Thử sử dụng tính năng bắt (Ngoại lệ e) thay vì chỉ định loại ngoại lệ – sLedgem

1

tôi sẽ cố gắng trả lời câu hỏi này là tốt nhất như tôi có thể:

Firstable như Tadeusz nói FindAllByResource ném một ngoại lệ khi không có thông tin cho tài nguyên quy định, để không sụp đổ bạn ứng dụng, bạn sẽ cần để bọc bạn logic trong một khối try-catch.

lý do để làm điều này là dành cho bạn để có thể tạo tài nguyên của bạn trong trường hợp bạn không có. vì vậy cách tôi nhìn thấy nó, bạn logic nên trông như thế này:

private Windows.Security.Credentials.PasswordCredential GetCredentialFromLocker() 
{ 
    Windows.Security.Credentials.PasswordCredential credential = null; 

    var vault = new Windows.Security.Credentials.PasswordVault(); 

    try 
    { 
     var credential = vault.FindAllByResource("MYapp").FirstOrDefault(); 

     return credential; 
    } 
    catch(Exception ex) 
    { 
     Debug.WriteLine($"Error retrieving Token: {ex.Message}"); 
    } 
    return null; 
} 

bây giờ tất cả bạn phải làm là để lưu trữ một mã thông báo mới trong passwordvault bạn

bạn phải đăng nhập đầu tiên và sau đó bạn lưu trữ các mã thông báo, do đó, lần sau bạn cố gắng truy xuất thông tin đăng nhập của mình, nó sẽ không ném ngoại lệ kể từ khi đã lưu trữ. bằng ví dụ nó phải được một cái gì đó như thế này:

await client.LoginAsync(provider); 

sau đó bạn lưu trữ thẻ của bạn như thế này:

PasswordVault.Add(new PasswordCredential("MYapp", 
        client.CurrentUser.UserId, 
        client.CurrentUser.MobileServiceAuthenticationToken)); 

Tôi hy vọng câu trả lời này giúp theo thứ tự, xin lỗi vì sự chậm trả lời nhưng, tôi thấy bản thân mình cố gắng giải quyết vấn đề này ngay bây giờ và tôi nghĩ tôi nên đưa ra một câu trả lời chi tiết hơn hoặc đầy đủ cho câu hỏi này.

Ngoài ra, bạn nên xem xét kiểm tra hết hạn mã thông báo và xử lý mới.