猿问

如何在 ASP.NET Core 的 Middleware 中设置用户的角色

目前 middleware 中的代码是这么写的

public class AuthorizeMiddleware{    private RequestDelegate _next;    public AuthorizeMiddleware(RequestDelegate next)    {
        _next = next;
    }    public async Task Invoke(HttpContext context, IUserService userService)    {        var identity = context.User.Identity;        if (identity.IsAuthenticated 
            && await userService.IsUserInRole(ROLE_NAME, identity.Name))
        {
            context.User.AddIdentity(new ClaimsIdentity("Basic", ClaimTypes.Role, ROLE_NAME));
        }        await _next(context);
    }
}

在 Authorization Policy 中使用这个角色进行授权,但不起作用

services.AddMvc(o =>
    {        var policy = new AuthorizationPolicyBuilder()
            .RequireRole(ROLE_NAME)
            .Build();
        o.Filters.Add(new AuthorizeFilter(policy));
    });

请问如何解决这个问题?


冉冉说
浏览 498回答 1
1回答

守着星空守着你

用 AddIdentity 是不正确的方法,需要在已有的 context.User.Identity 中添加 Claim ,但 context.User.Identity 的类型是 IIdentity ,它没有提供添加 Claim 的方法。后来在 stackoverflow 的 Update claims in ClaimsPrincipal 中知道了可以将 context.User.Identity 转换为 ClaimsIdentity ,通过它就可以添加 Claim 了。var claimsIdentity = context.User.Identity as ClaimsIdentity;if(claimsIdentity != null) {     claimsIdentity.AddClaim(new Claim(ClaimTypes.Role, ROLE_NAME)); }
随时随地看视频慕课网APP
我要回答