2016-08-02 3 views
9

मैं हाल ही में एक .NET कोर वेब एपीआई पर काम कर रहा हूं। मैंने https://stormpath.com/blog/token-authentication-asp-net-core पर मार्गदर्शिका का पालन करके, जेडब्ल्यूटी का उपयोग करके प्रमाणीकरण का प्रयास किया है।क्या मैं ASP.NET कोर में स्टार्टअप के दौरान डेटाबेस तक पहुंच सकता हूं?

जब तक मुझे डीबी क्वेरी के साथ GetIdentity विधि में कठोर कोडित उपयोगकर्ता नाम और पासवर्ड को प्रतिस्थापित नहीं करना पड़ा और मुझे एहसास हुआ कि मुझे नहीं पता कि इस फ़ाइल के भीतर से डीबी तक कैसे पहुंचना है!

विधि मैं करने के लिए लाइन 70. https://github.com/nbarbettini/SimpleTokenProvider/blob/master/test/SimpleTokenProvider.Test/Startup.Auth.cs

मेरे सवालों पर नीचे दिए गए लिंक में दिखाया गया है बात कर रहा हूँ इस प्रकार हैं।

  1. क्या मैं यहां डेटाबेस तक पहुंच सकता हूं? यदि हां, तो कैसे?
  2. क्या यह होना चाहिए जहां GetIdentity विधि है, या क्या कोई बेहतर तरीका है?

उत्तर

10

हाँ, आप डेटाबेस तक पहुंच सकते हैं! Configure विधि में चलने वाला कोड ConfigureServices विधि में जोड़े गए किसी भी सेवा तक पहुंच सकता है, जिसमें डेटाबेस संदर्भ जैसी चीजें शामिल हैं।

उदाहरण के लिए, यदि आप एक सरल इकाई की रूपरेखा संदर्भ है:

using Microsoft.EntityFrameworkCore; 
using SimpleTokenProvider.Test.Models; 

namespace SimpleTokenProvider.Test 
{ 
    public class SimpleContext : DbContext 
    { 
     public SimpleContext(DbContextOptions<SimpleContext> options) 
      : base(options) 
     { 
     } 

     public DbSet<User> Users { get; set; } 
    } 
} 

और आप इसे ConfigureServices में जोड़ें:

services.AddDbContext<SimpleContext>(opt => opt.UseInMemoryDatabase()); 

उसके बाद, आप उस तक पहुँच सकते हैं जब आप मिडलवेयर सेट कर रहे हैं :

var context = app.ApplicationServices.GetService<SimpleContext>(); 

app.UseSimpleTokenProvider(new TokenProviderOptions 
{ 
    Path = "/api/token", 
    Audience = "ExampleAudience", 
    Issuer = "ExampleIssuer", 
    SigningCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256), 
    IdentityResolver = (username, password) => GetIdentity(context, username, password) 
}); 

और GetIdentity विधि को एक लिट को फिर से लिखें ले:

private Task<ClaimsIdentity> GetIdentity(SimpleContext context, string username, string password) 
{ 
    // Access the database using the context 
    // Here you'd need to do things like hash the password 
    // and do a lookup to see if the user + password hash exists 
} 

मैं मूल नमूना का लेखक हूं। क्षमा करें यह शुरुआत में स्पष्ट नहीं था! मैंने IdentityResolver प्रतिनिधि को ऐसे तरीके से लिखने की कोशिश की जो आपकी अपनी कार्यक्षमता प्रदान करना आसान बनाता है - जैसे कि अपने डेटाबेस (ऊपर के रूप में) को एकीकृत करना, या इसे एएसपी.नेट कोर पहचान तक जोड़ना। बेशक, आप मेरे कोड को फेंकने और कुछ भी बेहतर करने के लिए स्वतंत्र हैं। :)

+3

तुम सिर्फ aspnet पहचान करने के लिए जेडब्ल्यूटी जोड़ रहे हैं तो आप dbcontext के बजाय signinmanager पारित हो सकता है::

मैं एक गुंजाइश का उपयोग कर GetIdentity में तो GetIdentity में ctx के बजाय एप्लिकेशन पारित कर दिया, var userManager = app.AplicationServices .GetService (typeof (UserManager )) – xcud

+0

@xcud यह वही है जो मैं करने की कोशिश कर रहा हूं लेकिन एक त्रुटि प्राप्त करें "स्कोप्ड सेवा को हल नहीं कर सकता" Microsoft.AspNetCore.Identity.UserManager' ", मुझे यहां क्या समझ नहीं आ रहा है? –

0

मैं किसी अन्य स्तर पर गलत हो सकता हूं लेकिन मुझे जो समाधान मिला वह एक गुंजाइश बनाना है।

using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope()) { 
    if (serviceScope.ServiceProvider.GetService<YourAppDbContext>() != null) 
    { 
     var ctx = serviceScope.ServiceProvider.GetService<YourAppDbContext>(); 

     if (AnAuthenticateMethodHereMaybe(ctx, username, password)) { 
     return Task.FromResult(new ClaimsIdentity(new 
GenericIdentity(username, "Token"), new Claim[] { })); 
     } 
    } 
    } 
संबंधित मुद्दे

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