ASP.NET Core 2.0 не может проверить, правильно ли играет роль пользователь в представлении Razor или в аннотации контроллера [authorize] - PullRequest
0 голосов
/ 11 октября 2018

Я работаю над устаревшим проектом с авторизацией на основе ролей, но у меня есть некоторые проблемы.User.IsInRole("admin") и [Authorize(Roles = "admin")] всегда с ошибкой авторизации.User.IsInRole() всегда возвращает False.Я уверен, что пользователь был правильно добавлен в роль.Role name 'admin' is already taken. User already in role 'admin'.

Возможно, какой-то сервис влияет на другой.

Вот мой возобновленный код startup.cs:

public void ConfigureServices(IServiceCollection services){

    services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(connetctionString));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, CustomUserClaimsPrincipalFactory>();
    services.AddMvc();
    services.AddDistributedMemoryCache();
    services.AddSession();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env){
    app.UseStaticFiles();
    app.UseAuthentication();
    app.UseMvc(routes => {...});
}

Чего мне не хватает?

PS.Да, я вошел в систему и авторизовался.

PS.Да, пользователь в роли администратора

PS.«Администратор» правильный в нижнем регистре

PS.ApplicationDbContext наследует IdentityDbContext

Ps2.Вот мои данные

SELECT id,username FROM aspnetusers;

|id          | username        |
|c4f7bf16... | admin@admin.com |

SELECT Id,Name FROM aspnetroles;

|Id          | Name  |
|50e2a572... | admin |

SELECT * FROM aspnetuserroles;

|UserId      | RoleId     |
|c4f7bf16... | 50e2a572...|

Ответы [ 6 ]

0 голосов
/ 31 октября 2018

После множества ошибок я наконец-то нашел то, что мне не хватало.

Я расширял только UserClaimsPrincipalFactory<ApplicationUser>, а не UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>.

После правильного расширения ролей смог претендовать.

public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
0 голосов
/ 18 октября 2018

У меня такое ощущение, что это потому, что ваш Roles и ваш Claims где-то перепутаны.

Согласно документам метод ClaimsPrincipal.IsInRole () проверяет наличиеПретензии типа ClaimsIdentity.RoleClaimType.

Можно установить претензию «admin», если она не относится к ClaimType ClaimsIdentity.RoleClaimType, и в этом случае она не пройдет аутентификацию.

0 голосов
/ 18 октября 2018

Вот несколько полезных методов, которые вы можете использовать для получения ролей пользователя или группы:

ApplicationGroupManager gm = new ApplicationGroupManager();

// Returns Role Name by using Role Id parameter
string roleName = RoleManager.FindById("").Name; 

// Returns Group Id and Role Id by using User Id parameter
var userGroupRoles = gm.GetUserGroupRoles(""); 

// Returns Group Roles by using Group Id parameter
var groupRoles = gm.GetGroupRoles(""); 

// Assing Group Role Names to a string array
string[] groupRoleNames = groupRoles.Select(p => p.Name).ToArray(); 


//###############################################################################################

/* Assign Default ApplicationGroupRoles to the User. As the default roles are already defined 
to the User after the first login to the system, there is no need to check if the role is NULL 
(otherwise it must be checked!!!) */

// Returns Group Roles by using Group Id parameter
var groupRoles = groupManager.GetGroupRoles("751b30d7-80be-4b3e-bfdb-3ff8c13be05e"); 

// Returns Group Roles by using Group Id parameter (Asynchronous method)
var groupRoles = await groupManager.GetGroupRolesAsync("751b30d7-80be-4b3e-bfdb-3ff8c13be05e"); 

//Assign ApplicationGroupRoles to the User
foreach (var role in groupRoles)
{
    string roleName = RoleManager.FindById(role.Id).Name;
    UserManager.AddToRole(user.Id, roleName);
}

С другой стороны, User.IsInRole () может использоваться условно в строке HTML (для стороны Razor View) (т. Е. DataTable), могут использоваться следующие методы:

@*Display Operations button according to the user roles:*@
@{
    string canView = Request.IsAuthenticated && User.IsInRole("CanViewTeam") ? "true" : "false";
}

<script>
    // assign C# variable to JavaScript variable.
    var CanView = @Html.Raw(@canView); 

    var table;

    $(document).ready(function () {

        table = $('#dtbTeam').DataTable({ 

            //Code omitted for brevity

            "render": function (data, type, full, meta) {
                var renderHtml = '';
                if(CanView){
                    renderHtml += '<a title="Details" id="lnkDetails" ></i></a>';
                }
                return renderHtml;
            }
        });             

    });
</script>

Надеюсь, это поможет ...

0 голосов
/ 12 октября 2018

Еще одна возможная проблема, пожалуйста, проверьте, является ли ваша роль роль admin.

Для Authorize или User.IsInRole он чувствителен к регистру, что означает, что если ваша роль называется Admin, она не будет выполнена для User.IsInRole("admin") или [Authorize(Roles = "admin")].

Чтобы проверить, является ли он admin, попробуйте await _userManager.IsInRoleAsync(user, "user"):

        var user = await _userManager.FindByNameAsync(User.Identity.Name);

        var r1 = User.IsInRole("User");
        var r2 = User.IsInRole("user");
        var r3 = await _userManager.IsInRoleAsync(user, "user");

Вы можете попытаться определить role как const, чтобы избежать несоответствия регистра.

0 голосов
/ 11 октября 2018

Убедитесь, что ваш ApplicationDbContext наследует IdentityDbContext

public class ApplicationDbContext: IdentityDbContext<ApplicationUser>
0 голосов
/ 11 октября 2018

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

Как это

var claims = User.Claims.ToList();
...