2017-08-25 30 views
5

Windows Kimlik Doğrulaması'nı kullanarak bir ASP.NET Çekirdeğim (.NET Framework tabanlı) kullanıyorum. Noktası, o kullanıcı için bir rol iddiası eklemem gerekiyor ve bu rol uzak bir veritabanında saklanıyor.ASP.NET Çekirdeği - Kullanıcı için rol isteği ekleme

OWIN/Cookie/UserManager/UserStore/Identity ile ilgili çok şey okudum ve kaybolacağım şekilde.

Soru: Geçerli uygulama için tüm uygulama için (pencereler) en kolay şekilde nasıl bir rol talebi ekleyebilirim? Ben gerekenler

kolayca Eğer DB (AspNetRoles) 'de yeni bir rol ekleyin ve sonra kullanıcı (AspNetUserRoles) atayabilir [Authorize(Role= "MyAddedRole")] veya bool res = User.IsInRole("MyAddedRole")

Teşekkür

cevap

7

yaptım yani ne kendimi cevaplama:

kendi UserClaimStore oluşturun (Ben sadece bu mağaza, diğerlerini gerekir):

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 
} 

Sonra oluşturulan kendi 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); 
    } 
} 

Sonunda, Startup.cs içinde:

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); 
     }); 
    } 

Ve şimdi [Authorize(Roles = "MyRole")] veya User.IsInRole("MyRole") veya User.HasClaim(/* */)'u bile kullanabilirim!

+0

Rollerinizin tanımlamanızın DB'nizden nasıl alındığını ve buna göre kullanıcılara nasıl atadığını daha fazla açıklayabilir misiniz? – iAziz

1

kullanmaktır.

+0

Belirli bir tabloyu "MyTable" okuman ve rol almak için belirli SELECT yapmam gerekiyor. –

+0

sonra Giriş yöntemini şu şekilde güncellemeniz gerekir: https://stackoverflow.com/questions/35153541/add-claims-on-successful-login-and-retrieve-it-elsewhere-in-the-application – vhr

+0

Ama ben loggin yöntemi yok, Windows kimlik doğrulaması kullanıyorum, bu yüzden kullanıcı başlangıçtan beri biliniyor, giriş sayfam yok, oturum açma yöntemi yok. –

İlgili konular