2014-05-21 5 views
12

का उपयोग करके डेटा सुरक्षा ऑपरेशन Azure पर असफल रहा था। मैं Azure में चल रहे ओविन/कटाना आधारित एएसपी.नेट एमवीसी वेबसाइट पर पासवर्ड रीसेट लागू करने का प्रयास कर रहा हूं।ओडिन/कटाना

स्थानीय स्तर पर चलने पर यह ठीक काम करता है लेकिन उत्पादन में विफल रहता है।

मैं एक UserToken प्रदाता

userManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(provider.Create("PasswordReset")) 

बनाने लेकिन जब मैं इस प्रकार टोकन उत्पन्न करने का प्रयास मैं अंत में एक अपवाद शो मिलता है।

var resetToken = await UserManager.GeneratePasswordResetTokenAsync(user.Id); 

System.Security.Cryptography.CryptographicException: The data protection operation was unsuccessful. This may have been caused by not having the user profile loaded for the current thread's user context, which may be the case when the thread is impersonating. 
    at System.Security.Cryptography.ProtectedData.Protect(Byte[] userData, Byte[] optionalEntropy, DataProtectionScope scope) 
    at System.Security.Cryptography.DpapiDataProtector.ProviderProtect(Byte[] userData) 
    at System.Security.Cryptography.DataProtector.Protect(Byte[] userData) 
    at Microsoft.Owin.Security.DataProtection.DpapiDataProtector.Protect(Byte[] userData) 
    at Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider`2.<GenerateAsync>d__0.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNet.Identity.UserManager`2.<GenerateUserTokenAsync>d__e9.MoveNext() 
+0

क्या आपको अभी तक समाधान मिला है? – Dragouf

+0

अभी तक नोट करें। कोई विचार? –

+0

हाँ मुझे एक कामकाज मिला लेकिन मैं पूरी तरह से संतुष्ट नहीं हूं। ऐसा लगता है कि यह ऐपनाम पैरामीटर के कारण है जो एप्लिकेशन में हर जगह समान नहीं है। तो मैंने IDataPRovider को instanciate करने के लिए OwinStartupAttribute से कॉन्फ़िगरेशन (IAppBuilder ऐप) कॉल के ऐप पैरामीटर का उपयोग किया और ऐसा लगता है कि यह काम करता है। डेटाप्रोवाइडर ऑब्जेक्ट प्राप्त करने के लिए आप इसे ऐसा कर सकते हैं: app.GetDataProtectionProvider()। मुझे बताएं कि यह – Dragouf

उत्तर

3

मुझे एक समाधान मिला। मैं बिल्कुल यकीन है कि अगर सभी कदम आवश्यक करने के लिए यह काम कर रहे हैं नहीं कर रहा हूँ, लेकिन अब मेरे ऐप पूरी तरह से काम करता है:

1.- securityTokenHandlers

<section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
<section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 

configSections नोड में समर्थन करने के लिए अपने web.config अद्यतन करें। और

<securityTokenHandlers> 
    <remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, 
       System.IdentityModel, Version=4.0.0.0, Culture=neutral, 
       PublicKeyToken=B77A5C561934E089" /> 

    <add 
     type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, 
      System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, 
      PublicKeyToken=B77A5C561934E089"> 
     <sessionTokenRequirement lifetime="00:30:00"></sessionTokenRequirement> 
    </add> 
    </securityTokenHandlers> 

</identityConfiguration> 

एक नियमित रूप से नोड के रूप में । 2.- अपने Startup.Auth.cs में फ़ाइल, इस तरह से अपनी ConfigureAuth (IAppBuilder एप्लिकेशन) अद्यतन:

public void ConfigureAuth(IAppBuilder app) 
     { 

      UserManagerFactory =() => 
      { 
       var userManager = new UserManager<SIAgroUser>(new UserStore<UserType>(new SIAgroUserDbContext())); 

       IDataProtectionProvider provider = app.GetDataProtectionProvider(); 

       //userManager.UserTokenProvider = new Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider<UserType>(provider.Create("PasswordReset")); 
       if (provider != null) 
       { 
        userManager.UserTokenProvider = new DataProtectorTokenProvider<UsertType, string>(provider.Create("PasswordReset")); 
       } 

       return userManager; 
      }; 

      OAuthOptions = new OAuthAuthorizationServerOptions 
      { 
       TokenEndpointPath = new PathString("/Token"), 
       Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory), 
       AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
       AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
       AllowInsecureHttp = true 
      }; 
      // Enable the application to use a cookie to store information for the signed in user 
      // and to use a cookie to temporarily store information about a user logging in with a third party login provider 
      app.UseCookieAuthentication(new CookieAuthenticationOptions()); 
      app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

      // Enable the application to use bearer tokens to authenticate users 
      app.UseOAuthBearerTokens(OAuthOptions); 

      // Uncomment the following lines to enable logging in with third party login providers 
      //app.UseMicrosoftAccountAuthentication(
      // clientId: "", 
      // clientSecret: ""); 

      //app.UseTwitterAuthentication(
      // consumerKey: "", 
      // consumerSecret: ""); 

      //app.UseFacebookAuthentication(
      // appId: "", 
      // appSecret: ""); 

      //app.UseGoogleAuthentication(); 



     } 

3.- इस तरह अपने स्टार्टअप वर्ग के निर्माता को साफ:

static Startup() 
{ 
    PublicClientId = "self"; 
} 

यह मेरे लिए काम करता है :) मुझे उम्मीद है कि यह आपके लिए भी काम करता है

+0

मुझे लगता है कि यह हिस्सा महत्वपूर्ण है: IDataProtectionProvider प्रदाता = app.GetDataProtectionProvider(); जैसा कि मैंने अपनी पिछली टिप्पणी में कहा था, मुझे लगता है कि यह ऐपनाम के साथ एक समस्या है। यदि आप अपने स्वयं के डेटाप्रोसेन्ट प्रदाता द्वारा तत्काल नामित करते हैं तो आप इसका उपयोग करने वाले एप्लिकेशन नाम से अलग नाम सेट करेंगे ... – Dragouf

+0

और मुझे लगता है कि उपयोगकर्ता प्रबंधक को तत्काल करने के लिए ओविन संदर्भ का उपयोग करना बेहतर है यदि आप किसी भी आईओएस: ऐप का उपयोग नहीं करते हैं। CreatePerOwinContext (ExtranetDbContext.Create); ऐप। क्रेतेपेरऑविनकॉन्टेक्स्ट (ApplicationUserManager.Create); – Dragouf

0

ओपन पाइपलाइन से उपयोगकर्ता प्रबंधक को प्राप्त करना, जैसा कि App_Start/Startup.Auth.cs में सेट है, Azure पर काम करता है। मुझे यकीन है कि यह विशेष रूप से कैसे काम करता है इस बारे में अनिश्चित है। डीपीएपी को पहले लिंक में वर्णित समाधान के साथ एज़ूर में काम करना चाहिए।

यदि डीपीएपीआई में वेब.कॉन्फिग में एक स्थिर मशीन कुंजी सेट है, तो सभी सर्वर मशीनें आपके वेबफर्म में किसी अन्य मशीन द्वारा बनाए गए एन्क्रिप्टेड डेटा को डिक्रिप्ट करने में सक्षम होंगी, इसके पीछे समझ है।

(कोड मानक टेम्पलेट के रूप में दी - AccountController.cs से)

private UserManager userManager; 
    public UserManager UserManager 
    { 
     get { return userManager ?? HttpContext.GetOwinContext().GetUserManager<UserManager>(); } 
     private set { userManager = value; } 
    } 
2

कृपया मेरे my answer इस सवाल का देखते हैं। एक बहुत सरल समाधान IAppBuilder.GetDataProtectionProvider()

1

उपयोग यह त्रुटि एक साझा होस्टिंग प्रदाता पर मेरे लिए होता है, लाइन पर प्राप्त किया जा सकता:

var provider = new DpapiDataProtectionProvider("SITENAME"); 

समाधान काफी सरल था।सबसे पहले यह करने के लिए ऊपर लाइन बदलने के लिए:

var provider = new MachineKeyProtectionProvider(); 

फिर एक नई फ़ाइल है, जो मैं अपने उपयोगिताएँ नाम स्थान में है बनाते हैं, तो जैसे:

using Microsoft.Owin.Security.DataProtection; 
using System.Web.Security; 

namespace <yournamespace>.Utilities 
{ 
    public class MachineKeyProtectionProvider : IDataProtectionProvider 
    { 
     public IDataProtector Create(params string[] purposes) 
     { 
      return new MachineKeyDataProtector(purposes); 
     } 
    } 

    public class MachineKeyDataProtector : IDataProtector 
    { 
     private readonly string[] _purposes; 

     public MachineKeyDataProtector(string[] purposes) 
     { 
      _purposes = purposes; 
     } 

     public byte[] Protect(byte[] userData) 
     { 
      return MachineKey.Protect(userData, _purposes); 
     } 

     public byte[] Unprotect(byte[] protectedData) 
     { 
      return MachineKey.Unprotect(protectedData, _purposes); 
     } 
    } 
} 

एट देखा! समस्या सुलझ गयी। बस याद रखें, आपके पासवर्ड रीसेट कंट्रोलर विधि में, आपको इस प्रदाता का भी उपयोग करना होगा, अन्यथा आपको Invalid Token त्रुटि मिल जाएगी।

4

मुझे एक ही समस्या है जब मैं एएसपी के साथ टोकन जेनरेट करने की कोशिश करता हूं। वेब एपीआई में नेट पहचान और कस्टम लॉगिन फ़ंक्शन।

"The data protection operation was unsuccessful. This may have been caused by not having the user profile loaded for the current thread's user context, which may be the case when the thread is impersonating." 

क्या मैं बस WEBSITE_LOAD_USER_PROFILE नामक एक एप्लिकेशन सेटिंग माइक्रोसॉफ्ट Azure में बना सकते हैं और 1. के लिए सेट समाधान मेरे लिए काम करता है है कि है था।

आप विवरण देख सकते हैं here

+0

यहां सबसे सरल समाधान है, और लिंक की तरह ही, मुझे इस सेटिंग के लिए लागू करने के लिए बेसिक और साझा योजनाओं से बचने की आवश्यकता है। – ericosg

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^