2017-08-25 13 views
5

पर भूमिका दावा जोड़ें मेरे पास विंडोज प्रमाणीकरण का उपयोग कर एएसपी.NET कोर (.NET Framework पर आधारित) है। प्वाइंट है, मुझे उस उपयोगकर्ता पर एक भूमिका दावा जोड़ने की आवश्यकता है और यह भूमिका दूरस्थ डेटाबेस में संग्रहीत है।एएसपी.नेट कोर - उपयोगकर्ता

मैंने ओविन/कुकी/उपयोगकर्ता प्रबंधक/उपयोगकर्तास्टोर/पहचान के बारे में बहुत कुछ पढ़ा है और इसलिए मैं खो गया हूं।

प्रश्न: मैं पूरे एप्लिकेशन के लिए (विंडोज़) में सबसे आसान तरीके से लॉग इन किए गए वर्तमान उपयोगकर्ता के लिए भूमिका दावा कैसे जोड़ूं?

मैं क्या जरूरत है आसानी से [Authorize(Role= "MyAddedRole")] या bool res = User.IsInRole("MyAddedRole")

धन्यवाद

उत्तर

7

अपने आप का जवाब, मैं इतना क्या किया:

मेरे अपने UserClaimStore बनाएँ (मैं केवल इस स्टोर, नहीं दूसरों की जरूरत है):

public class MyIdentityStore : 
    IUserClaimStore<IdentityUser> 
{ 
    private MyDbContext _myDbContext; 
    private bool _disposed = false; 

    public MyIdentityStore(MyDbContext myDbContext) 
    { 
     _myDbContext = myDbContext; 
    } 

    #region IUserClaimStore 
    public Task<IList<Claim>> GetClaimsAsync(IdentityUser user, CancellationToken cancellationToken) 
    { 
     // logic here to retrieve claims from my own database using _myDbContext 
    } 

    // All other methods from interface throwing System.NotSupportedException. 
    #endregion 

    #region IDisposable Support 

    protected virtual void Dispose(bool disposing) 
    { /* do cleanup */ } 
    #endregion 
} 

फिर बनाया अपने ही ClaimTransformer:

public class MyClaimsTransformer : IClaimsTransformer 
{ 
    private UserManager<IdentityUser> _userManager; 

    public MyClaimsTransformer(UserManager<IdentityUser> userManager) 
    { 
     _userManager = userManager; 
    } 

    public async Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context) 
    { 
     var identity = ((ClaimsIdentity)context.Principal.Identity); 

     // Accessing the UserClaimStore described above 
     var claims = await _userManager.GetClaimsAsync(new IdentityUser(identity.Name)); 
     identity.AddClaims(claims); 

     return await Task.FromResult(context.Principal); 
    } 
} 

अंत में, स्टार्टअप.cs में:

public void ConfigureServices(IServiceCollection services) 
    { 
     /* All other stuff here */ 

     // Adding Database connection 
     services.AddDbContext<MyDbContext>(o => /* my options */); 

     // Associates our database and store to identity 
     services.AddIdentity<IdentityUser, IdentityRole>() 
      .AddEntityFrameworkStores<MyDbContext>() 
      .AddUserStore<MyIdentityStore>(); 

     // Claims transformation from database to claims 
     services.AddTransient<IClaimsTransformer, MyClaimsTransformer>(); 
    } 


    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     /* All other stuff here */ 

     app.UseIdentity(); 

     app.UseClaimsTransformation(async (context) => 
     { // Retrieve user claims from database 
      IClaimsTransformer transformer = context.Context.RequestServices.GetRequiredService<IClaimsTransformer>(); 
      return await transformer.TransformAsync(context); 
     }); 
    } 

और अब मैं आसानी से [Authorize(Roles = "MyRole")] या User.IsInRole("MyRole") या User.HasClaim(/* */) का उपयोग कर सकता हूं!

+0

क्या आप और बता सकते हैं कि आपकी डीबी से भूमिकाओं की आपकी परिभाषा कैसे प्राप्त की गई और उन्हें तदनुसार उपयोगकर्ताओं को असाइन किया गया? – iAziz

1

उपयोग करने के लिए आप अपने डीबी (AspNetRoles) में एक नई भूमिका जोड़ने और फिर उपयोगकर्ता (AspNetUserRoles) को असाइन कर सकते हैं।

+0

मुझे एक विशिष्ट तालिका "मायटेबल" पढ़ने की आवश्यकता है और भूमिका पाने के लिए विशिष्ट चयन करें। –

+0

तो आपको या तो अपनी लॉगिन विधि को यहां अपडेट करना होगा: https://stackoverflow.com/questions/35153541/add-claims-on-sccessful-login-and-retrieve-it-elsewhere-in-the-plication – vhr

+0

लेकिन मेरे पास कोई लॉगजिन विधि नहीं है, मैं विंडोज प्रमाणीकरण का उपयोग करता हूं, इसलिए उपयोगकर्ता को शुरुआत से जाना जाता है, मेरे पास कोई लॉगिन पेज नहीं है, कोई लॉगिन विधि नहीं है। –

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