2017-08-25 18 views
5

Tôi đã sử dụng ASP.NET Core (dựa trên .NET Framework) bằng Xác thực Windows. Điểm là, tôi cần phải thêm một yêu cầu vai trò trên người dùng đó và vai trò này được lưu trữ trong một cơ sở dữ liệu ở xa.ASP.NET Core - Thêm xác nhận quyền sở hữu vai trò cho Người dùng

Tôi đã đọc rất nhiều điều về OWIN/Cookie/UserManager/UserStore/Identity và do đó tôi bị mất.

Câu hỏi: Làm cách nào để thêm xác nhận quyền sở hữu vai trò cho người dùng hiện tại đăng nhập (cửa sổ) cho toàn bộ ứng dụng theo cách dễ nhất?

Những gì tôi cần là để dễ dàng sử dụng [Authorize(Role= "MyAddedRole")] hoặc bool res = User.IsInRole("MyAddedRole")

Cảm ơn

Trả lời

7

trả lời bản thân mình, vì vậy những gì tôi đã làm:

Tạo UserClaimStore của riêng tôi (tôi chỉ cần cửa hàng này, không phải là những người khác):

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 
} 

Sau đó tạo ClaimTransformer của riêng tôi:

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

Cuối cùng, trong 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); 
     }); 
    } 

Và bây giờ tôi có thể tự do sử dụng [Authorize(Roles = "MyRole")] hoặc User.IsInRole("MyRole") hoặc thậm chí User.HasClaim(/* */)!

+0

Bạn có thể giải thích thêm về cách định nghĩa vai trò của bạn được lấy từ DB của bạn và gán chúng cho người dùng tương ứng không? – iAziz

1

Bạn có thể thêm một vai trò mới trong DB của bạn (AspNetRoles) và sau đó gán nó cho người sử dụng (AspNetUserRoles).

+0

Tôi cần đọc bảng cụ thể "MyTable" và thực hiện SELECT cụ thể để nhận vai trò. –

+0

thì bạn phải cập nhật phương thức Đăng nhập của mình như sau: https://stackoverflow.com/questions/35153541/add-claims-on-successful-login-and-retrieve-it-elsewhere-in-the-application – vhr

+0

Nhưng tôi không có phương pháp loggin, tôi sử dụng xác thực Windows, vì vậy người dùng được biết từ đầu, tôi không có trang đăng nhập, không có phương thức đăng nhập. –

Các vấn đề liên quan