2017-08-25 85 views
5

我有一個使用Windows身份驗證的ASP.NET核心(基於.NET Framework)。要點是,我需要爲該用戶添加角色聲明,並且此角色存儲在遠程數據庫中。ASP.NET核心 - 向用戶添加角色聲明

我讀過很多關於OWIN/Cookie/UserManager/UserStore/Identity等的東西,我迷路了。

問:如何以最簡單的方式爲當前用戶登錄(Windows)爲整個應用程序添加角色聲明?

我需要的是能夠輕鬆使用[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); 
    } 
} 

最後,在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); 
     }); 
    } 

現在我可以自由使用[Authorize(Roles = "MyRole")]User.IsInRole("MyRole")甚至User.HasClaim(/* */)

+0

您能否更詳細地解釋如何從數據庫中檢索角色的定義並將其分配給用戶? – iAziz

1

您可以在DB(AspNetRoles)添加一個新的角色,然後將其分配給用戶(AspNetUserRoles)。

+0

我需要讀取一個特定的表「MyTable」並執行特定的SELECT來獲取角色。 –

+0

然後你必須更新你的登錄方法就像這裏:https://stackoverflow.com/questions/35153541/add-claims-on-successful-login-and-retrieve-it-elsewhere-in-the-application – vhr

+0

但我沒有登錄方法,我使用Windows身份驗證,所以用戶從開始就知道,我沒有登錄頁面,沒有登錄方法。 –

相關問題