Asp.net core mvc Asp.Net核心标识-无角色的简单授权表

Asp.net core mvc Asp.Net核心标识-无角色的简单授权表,asp.net-core-mvc,authorization,asp.net-identity,asp.net-core-3.1,Asp.net Core Mvc,Authorization,Asp.net Identity,Asp.net Core 3.1,我正在尝试为我的应用程序开发一个简单的用户授权机制,而不使用特定的角色表 用户实体有一个简单的Role enum属性,我想在一些控制器上适当地修饰Authorize属性 也许我在这里遗漏了一些东西,但是我如何让框架知道用户登录时或登录后的角色是什么 var result = await _signInManager.PasswordSignInAsync(usr, pwd, false, lockoutOnFailure: false); 然后使用Authorize属性?您可以使用identi

我正在尝试为我的应用程序开发一个简单的用户授权机制,而不使用特定的角色表

用户实体有一个简单的Role enum属性,我想在一些控制器上适当地修饰
Authorize
属性

也许我在这里遗漏了一些东西,但是我如何让框架知道用户登录时或登录后的角色是什么

var result = await _signInManager.PasswordSignInAsync(usr, pwd, false, lockoutOnFailure: false);

然后使用
Authorize
属性?

您可以使用identity server的ProfileService向特定用户添加角色声明。您需要添加的地方

claims.Add(new Claim("Role","Admin"));
此外,您还需要在starup.cs as中实施策略

services.AddAuthorization(options =>
    {
        options.AddPolicy("AdminCheck", policy =>
                          policy.RequireClaim("Role", "Admin"));
    });
在您的操作方法或控制器上,您需要将decorator作为

[Authorize(Policy = "AdminCheck")]
public class VacationController : Controller
{
    public ActionResult VacationBalance()
    {
    }
}
就是这样。

可以帮助向用户添加指定的声明,您可以尝试以下代码片段来实现您的要求

var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);

if (result.Succeeded)
{
    var user = await _userManager.FindByNameAsync(Input.Email);

    var userRole = CustomMethod_FindUserRole(Input.Email);

    await _userManager.AddClaimAsync(user, new Claim(ClaimTypes.Role, userRole));

    //...

    await _signInManager.RefreshSignInAsync(user);


    //...

非常感谢。我试图做一些类似的事情,但我不明白索赔应该在哪里传递。添加角色声明后,如何使用声明对象?谢谢。我认为这应该是可以接受的答案,但也许您应该指定您必须正确地实现addsync