2017-04-11 12 views
5

मैंने एक वेब एप्लिकेशन बनाया है। जब मैं इसे बनाया मैं टिक 'संगठनात्मक खाते'लॉगिन ईवेंट कैप्चर करना ताकि मैं अन्य उपयोगकर्ता जानकारी कैश कर सकूं

यह अच्छी तरह से काम करता है - मैं अपने Office 365 खाते के साथ प्रवेश और User.Identity.Name ईमेल पता

इस आवेदन एक स्थानापन्न के सामने एक बड़ी एएसपी क्लासिक अनुप्रयोग के लिए खत्म होता है। ऐप में एक मौजूदा सुरक्षा तालिका है जिसका उपयोग करने की आवश्यकता है।

मैं पाने के लिए इस तालिका में एक रिकॉर्ड को देखने के लिए ईमेल पते का उपयोग करना चाहते हैं

  • उपयोगकर्ता (तो मैं डेटाबेस कॉल में उपयोग कर सकते हैं)

  • के लिए आंतरिक डाटाबेस कुंजी सुरक्षा स्तर (प्राधिकरण) उपयोगकर्ता

मैं इस जैसे ही मैंने प्रमाणीकृत कर रहा हूँ ऊपर देखो और Session का उल्लेख करने के लिए इन दो मानों को बचाने के लिए चाहते हैं के लिए बाद में

मेरे पास एक मौजूदा विधि है जो यह सभी लुकअप और कैशिंग करता है। मुझे वास्तव में यह _LoginPartial.cshtml दृश्य से कॉल करके काम कर रहा है लेकिन स्पष्ट रूप से यह देखने के लिए गलत है कि इस तरह की चीज़ को

देखने के लिए कोड यहां क्लिक करें और उपयोगकर्ता जानकारी कैश करें। अभी के लिए इस AccountController.cs में है, लेकिन यह

private Boolean GetAdditionalUserInfo() 
{ 
    // if authentication info is saved, don't go find it 
    if (Session["UID"] != null) return true; 

    // get the db employee id from the database and save it to the session 
    var r = (
      from e in db.Employees 
      where e.Email == User.Identity.Name 
      select new 
      { 
       e.Emp_ID, 
       e.Group_ID 
      } 
      ).SingleOrDefault(); 

    if ((r == null) || (r.Group_ID == (int)Role.Inactive)) 
    { 
     // couldn't find record or inactive 
     return false; 
    } 

    // Update last login datetime 
    Employee ell = db.Employees.Find(r.Emp_ID); 
    ell.LastLogin = DateTime.Now; 
    db.SaveChangesAsync(); 

    // Save user details to the session 
    Session["UID"] = r.Emp_ID; 
    // TBD: Investigate "CLAIMS" - this should probably be a claim 
    Session["Role"] = r.Group_ID; 

    return true; 

} 

मुझे लगता है कि User.Identity.Name के संदर्भ में प्रवेश प्रक्रिया से चलाता है तो मैं या तो बस कोशिश करते हैं और स्टार्टअप पर यह कह सकते हैं (मैं सही पता नहीं है हो सकता है की जरूरत नहीं है ऐसा करने का तरीका), या मुझे लगता है कि OnAuthentication विधि का उपयोग करके इसे कॉल करना उचित है और इसे लिंक करने के लिए मुझे अपने फ़ंक्शन का नाम OnAuthenticated संपत्ति पर पास करना चाहिए। यहाँ विधि और संपत्ति को दो लिंक है:

https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.onauthentication(v=vs.118).aspx

https://msdn.microsoft.com/en-us/library/microsoft.owin.security.microsoftaccount.microsoftaccountauthenticationprovider.onauthenticated(v=vs.113).aspx

लेकिन मैं कहना है कि OO प्रोग्रामिंग मेरी बात नहीं है है और मैं इन पृष्ठों से बाहर काम नहीं कर सकता उनके उपयोग का तरीका या किस वर्ग में उन्हें डाल दिया।

यह page का तात्पर्य है कि इसे Startup.Auth.cs में जाना होगा लेकिन मेरा Startup.Auth.cs ऐसा कुछ नहीं दिखता है। यहां मेरे अधिकांश Startup.Auth.cs हैं जो ज्यादातर शुरुआत में 'संगठनात्मक' चुनते थे। (एक तरफ ध्यान दें पर, app.UseKentorOwinCookieSaver(); मेरी अगली चुनौती क्योंकि जाहिरा तौर पर संगठनात्मक लॉगिन Session साथ काम नहीं करता आप विश्वास कर सकते है !!!)

किसी को भी मुझे GetAdditionalUserInfo() कॉल करने के लिए आवश्यक कोड जोड़ने में मदद कर सकते हैं? लॉगिन के बाद? या वैकल्पिक रूप से पुष्टि करें कि मैं इसे स्टार्टअप पर बस कॉल कर सकता हूं, और इसे करने का सही तरीका सुझा सकता हूं।

public partial class Startup 
{ 
    private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"]; 
    private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"]; 
    private static string tenantId = ConfigurationManager.AppSettings["ida:TenantId"]; 
    private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"]; 
//private static string authority = aadInstance + tenantId; 
// to make this multi tenant, use common endpoint, not the tenant specific endpoint 
private static string authority = aadInstance + "common"; 

public void ConfigureAuth(IAppBuilder app) 
{ 
    app.SetDefaultSignInAsAuthenticationType(
     CookieAuthenticationDefaults.AuthenticationType); 

    // https://stackoverflow.com/questions/20737578/asp-net-sessionid-owin-cookies-do-not-send-to-browser 
    app.UseKentorOwinCookieSaver(); 

    app.UseCookieAuthentication(
     new CookieAuthenticationOptions()); 

    app.UseOpenIdConnectAuthentication(
     new OpenIdConnectAuthenticationOptions 
     { 
      ClientId = clientId, 
      Authority = authority, 
      PostLogoutRedirectUri = postLogoutRedirectUri, 
      TokenValidationParameters = new TokenValidationParameters 
      { 
       // If you don't add this, you get IDX10205 
       // from here http://charliedigital.com/2015/03/14/adding-support-for-azure-ad-login-o365-to-mvc-apps/ 
       ValidateIssuer = false       
      }, 
      Notifications = new OpenIdConnectAuthenticationNotifications 
      { 
       RedirectToIdentityProvider = ctx => 
       { 
        bool isAjaxRequest = (ctx.Request.Headers != null && ctx.Request.Headers["X-Requested-With"] == "XMLHttpRequest"); 

        if (isAjaxRequest) 
        { 
         ctx.Response.Headers.Remove("Set-Cookie"); 
         ctx.State = NotificationResultState.HandledResponse; 
        } 

        return System.Threading.Tasks.Task.FromResult(0); 
       } 
      } 
     }); 
    } 
} 
+0

कैसे उपयोगकर्ता प्रमाणीकृत हो जाता है आज? क्या आपके लिए 'ओपन ओपन कनेक्ट कनेक्ट प्रमाणीकरण' काम करता है? –

+0

हां। प्रमाणीकरण ठीक काम करता है। मुझे नहीं पता कि OnAthenticated का उपयोग कैसे करें। मैंने इन कोड नमूने को देखा है लेकिन वे मेरे कोड के समान नहीं हैं, और स्वत: पूर्ण यह नहीं दिखाता है कि ऑन प्रमाणीकृत किसी भी हिस्से में मान्य है। यहां मिले कोड नमूने यहां दिए गए हैं: http://stackoverflow.com/questions/19758485/how-to-pass-information-from-onauthenticated-event-to-a-controller-and-signin http://stackoverflow.com/ प्रश्न/19456008/कैसे करते हैं-ए-पहुँच-माइक्रोसॉफ्ट-Owin-सुरक्षा-xyz-onauthenticated-संदर्भ addclaims-VA/19530628 # 19530628। मैं अधिक जानकारी के साथ प्रश्न भी संपादित करूंगा –

उत्तर

3

लेख The OWIN OpenID Connect Middleware में आप कैसे आप Notifications इस्तेमाल कर सकते हैं विस्तृत विवरण मिल सकता है।आप मामले में आप SecurityTokenValidated की सदस्यता चाहिए:

RedirectToIdentityProvider = ctx => {...}, 
SecurityTokenValidated = (context) => 
{ 
    string userID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value; 

    // Here you can retrieve information from Database. Let's say you get r.Group_ID. 

    var role = r.Group_ID; 

    // You can now add it to Identity and no need to use session. 

    Claim roleClaim = new Claim(
     "http://nomatterwhatyouput/role", 
     role, 
     ClaimValueTypes.[RoleType], 
     "LocalAuthority"); 
    context.AuthenticationTicket.Identity.AddClaim(roleClaim); 

    // Do same for all values you have. Remember to set unique claim URL for each value. 

    return Task.CompletedTask; 
}, 

और फिर आप के रूप में है कि लेख में उल्लेख किया है कि आप कार्रवाई में उन मूल्यों को प्राप्त कर सकते हैं:

public ActionResult Index() 
{ 
    var role = ClaimsPrincipal.Current.FindFirst("http://nomatterwhatyouput/role"); 
    return View(); 
} 
+0

मेट यह _exactly_ है जो मैं बाद में हूं। मुझे कोड थोड़ा सा बदलना पड़ा और मैं इसे पोस्ट करूंगा। आपने वास्तव में 'सत्र' के आस-पास अपना अन्य मुद्दा हल किया। मैं वास्तव में प्रसन्न हूं क्योंकि मुझे लगता है कि इस दावे की बात के साथ मैं सुरक्षा के लिए विधि सजावट का उपयोग कर सकता हूं। बिलकुल शानदार! –

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

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