3

Я создал основной проект asp.net в visual studio 2015 с проверкой подлинности Windows. Я не могу понять, как добавить роли в Identity.Как добавить роли для проверки подлинности Windows в ASP.NET Core

У меня есть таблица с именами пользователей для учетной записи Windows. И когда пользователь открывает сайт, пользователь добавляется в Identity (я предполагаю, что это то, что происходит, потому что я могу отображать имя пользователя по User.Identity.Name), и я хочу вывести роли из другой таблицы и назначить их пользователю , Это возможно? Или, может быть, есть лучший способ сделать это? (Почему ?, Как?)

Я не смог найти примеры конкретных примеров, связанных с проверкой подлинности Windows, но я прочитал документацию и прошел через this guide. И я все еще застрял.

+0

вы можете показать свой код, включая ваши с помощью утверждений. Я предполагаю, что на данном этапе вы не ссылаетесь на 'System.DirectoryServices' на данный момент. Когда вы это сделаете, вы можете получить информацию об AD с относительной легкостью –

+0

@SimonPrice У меня нет кода, чтобы показать, извините, я отказался от каждой моей попытки, потому что она не сработала. Но для того, чтобы дать вам представление, это просто новый проект с проверкой подлинности Windows, и оттуда я просто страдал и терпел неудачу. Я обязательно посмотрю «System.DirectoryServices», также что такое AD? –

+0

AD - это Active Directory. Какова идея проекта, который вы пытаетесь достичь? –

ответ

4

это работает код, который я использую, чтобы проверить, пользователь находится в роли \ группы, пожалуйста, используйте его на досуге

using System.Collections.Generic; 
using System.DirectoryServices.AccountManagement; 
using System.Linq; 
using System.Security.Principal; 

namespace Santander.IsUserInGroupOrRole_cs 
{ 

public class IsUserInRole 
{ 

    public static bool IsInGroup(string groupName) 
    { 
     var myIdentity = GetUserIdWithDomain(); 
     var myPrincipal = new WindowsPrincipal(myIdentity); 
     return myPrincipal.IsInRole(groupName); 
    } 

    public bool IsInGroup(List<string> groupNames) 
    { 
     var myIdentity = GetUserIdWithDomain(); 
     var myPrincipal = new WindowsPrincipal(myIdentity); 

     return groupNames.Any(group => myPrincipal.IsInRole(group)); 
    } 

    public static WindowsIdentity GetUserIdWithDomain() 
    { 
     var myIdentity = WindowsIdentity.GetCurrent(); 
     return myIdentity; 
    } 

    public static string GetUserId() 
    { 
     var id = GetUserIdWithDomain().Name.Split('\\'); 
     return id[1]; 
    } 

    public static string GetUserDisplayName() 
    { 
     var id = GetUserIdWithDomain().Name.Split('\\'); 

     var dc = new PrincipalContext(ContextType.Domain, id[0]); 
     var adUser = UserPrincipal.FindByIdentity(dc, id[1]); 
     return adUser.DisplayName; 

    } 


} 



} 
+0

Вы могли бы показать/объяснить, как добавлять роли в учетную запись Windows до или после их подключения? –

+1

, если вы можете быть в ссылке чата, которую я отправил вчера в 20:00 сегодня вечером, тогда да, я могу вам это рассказать –

7

С проверкой подлинности Windows ролей происходят из Active Directory, а не базы данных.

Вы можете использовать формулу Претензий, чтобы изменить входящий идентификатор в каждом запросе, чтобы вытащить дополнительные роли из вашей базы данных.

public class ClaimsTransformer : IClaimsTransformer 
{ 
    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal) 
    { 
     ((ClaimsIdentity)principal.Identity).AddClaim(
      new Claim("ExampleClaim", "true")); 
     return Task.FromResult(principal); 
    } 
} 

А затем подключить его с

app.UseClaimsTransformation(new ClaimsTransformationOptions 
{ 
    Transformer = new ClaimsTransformer() 
}); 

Обратите внимание, что в данном воплощении нет никакой поддержки DI, так что вам придется вручную вытащить информацию из базы данных из DI, если это где ,

+0

Связанная проблема на github - https://github.com/aspnet/Security/issues/863 – resnyanskiy

+3

@blowdart делает это в .netcore 2.0? Я не нашел UseClaimsTransformation. – user3885927

+0

Похоже, это было немного изменено в версии 2.0. См. Https://stackoverflow.com/questions/45709296/asp-net-core-2-0-claims-transformation-support-missing. –

0

Для всех, кого это интересует, приведен простой пример того, как вы можете вставлять EF DBContext в пользовательский ClaimsTransformer и добавлять некоторые пользовательские заявки на роль.

Startup.cs

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddScoped<IClaimsTransformer, MyClaimsTransformer>(); 

    services.AddMvc(); 

    services.AddDbContext<MyDbContext>(options => options.UseSqlServer(
     Configuration.GetConnectionString("MyConnStringSetting") 
    )); 

    (...) 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    app.UseClaimsTransformation(context => 
    { 
    var transformer = context.Context.RequestServices.GetRequiredService<IClaimsTransformer>(); 
    return transformer.TransformAsync(context); 
    }); 

    (...) 
} 

MyClaimsTransformer.cs

public class MyClaimsTransformer : IClaimsTransformer 
{ 
    private readonly MyDbContext _context; 

    public MyClaimsTransformer(MyDbContext context) 
    { 
    _context = context; 
    } 

    public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context) 
    { 
    var identity = (ClaimsIdentity)context.Principal.Identity; 
    var userName = identity.Name; 
    var roles = _context.Role.Where(r => r.UserRole.Any(u => u.User.Username == userName)).Select(r => r.Name); 
    foreach (var role in roles) 
    { 
     var claim = new Claim(ClaimTypes.Role, role); 
     identity.AddClaim(claim); 
    } 
    return Task.FromResult(context.Principal); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^