2017-08-25 22 views
5

Mam Core ASP.NET (w oparciu o .NET Framework) przy użyciu uwierzytelniania systemu Windows. Chodzi o to, że muszę dodać roszczenie do roli dla tego użytkownika, a ta rola jest przechowywana w odległej bazie danych.ASP.NET Core - Dodaj roszczenie do roli dla użytkownika

Wiele czytałem na temat OWIN/Cookie/UserManager/UserStore/Identity i tak dalej, że jestem zagubiony.

Pytanie: Jak w najprostszy sposób dodać oświadczenie o roli dla bieżącego użytkownika zalogowanego (systemu Windows) dla całej aplikacji?

Co potrzebne jest, aby łatwo korzystać [Authorize(Role= "MyAddedRole")] lub bool res = User.IsInRole("MyAddedRole")

Dzięki

Odpowiedz

7

Odpowiadając na siebie, więc co zrobiłem:

Utwórz własny UserClaimStore (Potrzebuję tylko ten sklep, a nie innych):

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 
} 

Następnie stworzył własne 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); 
    } 
} 

Endly, w Startup.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); 
     }); 
    } 

A teraz mogę swobodnie używać [Authorize(Roles = "MyRole")] lub User.IsInRole("MyRole") lub nawet User.HasClaim(/* */)!

+0

Czy możesz wyjaśnić, w jaki sposób definicja ról została pobrana z bazy danych i odpowiednio przypisać ją do użytkowników? – iAziz

1

Można dodać nową rolę w dB (AspNetRoles), a następnie przypisać ją do użytkownika (AspNetUserRoles).

+0

Muszę przeczytać konkretną tabelę "MyTable" i wykonać specyficzne polecenie SELECT, aby uzyskać tę rolę. –

+0

musisz więc zaktualizować swoją metodę logowania, tak jak tutaj: https://stackoverflow.com/questions/35153541/add-claims-on-successful-login-and-retrieve-it-elsewhere-in-the-application – vhr

+0

Ale nie mam metody logowania, używam uwierzytelniania systemu Windows, więc użytkownik jest znany od początku, nie mam strony logowania, nie ma metody logowania. –

Powiązane problemy