2014-07-11 10 views
7

नेट WebApi2 का उपयोग करना: मैं जब एक WebAPI में लॉग इन करने का प्रयास कर रहा एक 500 आंतरिक सर्वर त्रुटि हो रही है, /टोकन समाप्ति बिंदु पर।डिबगिंग WebApi2 लॉगिन (/ टोकन) endpoint

मुझे पता है स्टार्टअप.एथ में कुछ कॉन्फ़िगरेशन पैरामीटर हैं, लेकिन वैसे भी मैं ब्रेकपॉइंट सेट कर सकता हूं, या अन्यथा सर्वर पर क्या दिख रहा है? (कहें, प्रमाणीकरण जांच होने से पहले, और बाद में - फिडलर प्रकार इंटरसेप्ट समाधान की तलाश नहीं है)।

+0

जब तक आप एक कस्टम OAuth प्रदाता का उपयोग कर रहे आप एक ब्रेकप्वाइंट नहीं डाल सकते जहां तक ​​मैं कह सकता हूं। जब तक कोड खुला स्रोत न हो और आप प्रोजेक्ट डाउनलोड कर सकें और इसे अपने समाधान में आयात कर सकें। अपवाद के ब्योरे को पाने का कोई तरीका नहीं है? उदाहरण के लिए elmah का उपयोग कर या कस्टम त्रुटि संदेशों को बंद कर रहे हैं? – grimurd

+0

सुझावों के लिए धन्यवाद - मैंने webapiconfig के अंदर कस्टम त्रुटियों को सेट करके डिबगिंग करने का प्रयास किया ... देखा कि यह एक "SystemInvalidOperation अपवाद" था लेकिन इससे ज्यादा मदद नहीं मिली। मैं ईल्माह की कोशिश करूंगा, इससे पहले नहीं सुना था। निगाह डालने के लिए धन्यवाद! ओ पी के रूप में मुझे एक ही समस्या है, तो – ASX

उत्तर

-1

आप इसे डीबग कर सकते हैं ... लेकिन आप अपने खुद के ApplicationOAuthProvider जो इस वर्ग से विरासत चाहिए लागू करने की आवश्यकता:

public class MyTokenProvider : OAuthAuthorizationServerProvider 
{ 
    private readonly string _publicClientId; 

    public MyTokenProvider(string publicClientId) 
    { 
     if (publicClientId == null) 
     { 
      throw new ArgumentNullException("publicClientId"); 
     } 

     _publicClientId = publicClientId; 
    } 

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>(); 

     ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password); 

     if (user == null) 
     { 
      context.SetError("invalid_grant", "The user name or password is incorrect."); 
      return; 
     } 

     ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, 
      OAuthDefaults.AuthenticationType); 
     ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager, 
      CookieAuthenticationDefaults.AuthenticationType); 

     AuthenticationProperties properties = CreateProperties(user.UserName); 
     AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties); 
     context.Validated(ticket); 
     context.Request.Context.Authentication.SignIn(cookiesIdentity); 
    } 

    public override Task TokenEndpoint(OAuthTokenEndpointContext context) 
    { 
     foreach (KeyValuePair<string, string> property in context.Properties.Dictionary) 
     { 
      context.AdditionalResponseParameters.Add(property.Key, property.Value); 
     } 

     return Task.FromResult<object>(null); 
    } 

    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
     // Resource owner password credentials does not provide a client ID. 
     if (context.ClientId == null) 
     { 
      context.Validated(); 
     } 

     return Task.FromResult<object>(null); 
    } 

    public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context) 
    { 
     if (context.ClientId == _publicClientId) 
     { 
      Uri expectedRootUri = new Uri(context.Request.Uri, "/"); 

      if (expectedRootUri.AbsoluteUri == context.RedirectUri) 
      { 
       context.Validated(); 
      } 
     } 

     return Task.FromResult<object>(null); 
    } 

    public static AuthenticationProperties CreateProperties(string userName) 
    { 
     IDictionary<string, string> data = new Dictionary<string, string> 
     { 
      { "userName", userName } 
     }; 
     return new AuthenticationProperties(data); 
    } 
} 

जाहिर है आप की आवश्यकता होगी: OAuthAuthorizationServerProvider

उदाहरण के लिए इसे अपने डिफ़ॉल्ट प्रदाता के रूप में सेट करें, और यह आपके स्टार्टअप से किया जा सकता है .Auth.cs

उदाहरण:

  OAuthOptions = new OAuthAuthorizationServerOptions 
     { 
      TokenEndpointPath = new PathString("/Token"), 
      Provider = new MyTokenProvider(PublicClientId), 
      AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
      AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
      AllowInsecureHttp = true 
     }; 

तो फिर तुम यह डीबग कर सकते हैं :)

+0

गलत जवाब, http://stackoverflow.com/a/31487544/631527 – Toolkit

11

डिबग GrantResourceOwnerCredentials प्रदाताओं में विधि/ApplicationOAuthProvider.cs

+0

नीचे सही देखते हैं, तो त्रुटि 'TokenEndpoint' के बाद होता है, लेकिन इससे पहले' TokenEndpointResponse', तो एक कस्टम ' OAuthAuthorizationServerProvider 'कार्यान्वयन मदद नहीं करता है। मेरे लिए, यह केवल लिनक्स पर मोनो 3 और 4 चल रहा है। – sunside

0

आप सभी अपवादों पर तोड़ने के लिए और उसके बाद प्राप्त करने के लिए दृश्य स्टूडियो कॉन्फ़िगर कर सकते हैं और अधिक जब यह फेंकता है तो आपकी त्रुटि के बारे में जानकारी।

विजुअल स्टूडियो 2013 डिबग मेनू, अपवाद में, जैसा कि चित्र में दिखाए गए अपवाद CLR से संबंधित दोनों ckecks निशान:

enter image description here

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