gpt4 book ai didi

c# - 基于客户端特定角色的身份验证?

转载 作者:太空狗 更新时间:2023-10-30 01:29:39 24 4
gpt4 key购买 nike

目前,我在我的应用程序中使用基于角色的身份验证和 OAuth 和 WebApi 对用户进行身份验证。我是这样设置的:

public override async Task GrantResourceOwnerCredentials (OAuthGrantResourceOwnerCredentialsContext context)
{
var user = await AuthRepository.FindUser(context.UserName, context.Password);

if (user === null)
{
context.SetError("invalid_grant", "The username or password is incorrect");
return;
}

var id = new ClaimsIdentity(context.Options.AuthenticationType);
id.AddClaim(New Claim(ClaimTypes.Name, context.UserName));

foreach (UserRole userRole in user.UserRoles)
{
id.AddClaim(new Claim(ClaimTypes.Role, userRole.Role.Name));
}

context.Validated(id);
}

使用 <Authorize> 保护我的 API 路由标签。

但是,从那以后,我遇到了一个问题,即我的用户可以为不同的客户担任不同的角色。例如:

用户 A 可以关联到多个客户端:客户端 A 和客户端 B。
当从任一客户端访问信息时,用户A可以具有不同的“角色”。因此用户 A 可能是客户端 A 的管理员和客户端 B 的基本用户。

这意味着,下面的例子:

[Authorize(Roles = "Admin")]
[Route("api/clients/{clientId}/billingInformation")]
public IHttpActionResult GetBillingInformation(int clientId)
{
...
}

用户 A 可以访问客户 A 的账单信息,但不能访问客户 B 的账单信息。

显然,我现在所拥有的不适用于这种类型的身份验证。设置基于客户端特定角色的身份验证的最佳方法是什么?我可以简单地改变我现在拥有的东西,还是我必须以完全不同的方式设置它?

最佳答案

您可以删除授权标签并改为在函数内进行角色验证。

Lambda 解决方案:

有没有根据CustomerID和UserID添加的角色?
如果是这样,您可以像下面的示例那样根据您拥有的值获取客户,然后返回响应。

string userID = RequestContext.Principal.Identity.GetUserId();
var customer = Customer.WHERE(x => x.UserID == userID && x.clientId == clientId && x.Roles == '1')

您能否向我们提供更多有关您使用什么来存储客户和用户之间的联系/角色的信息。

编辑:

这是一个关于如何使用 ActionFilterAttribute 的示例。它从请求中获取 CustomerId,然后从请求中获取身份的 UserId。所以你可以用 [UserAuthorizeAttribute] 替换 [Authorize]

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class UserAuthorizeAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
try
{
var authHeader = actionContext.Request.Headers.GetValues("Authorization").First();
if (string.IsNullOrEmpty(authHeader))
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
{
Content = new StringContent("Missing Authorization-Token")
};
return;
}

ClaimsPrincipal claimPrincipal = actionContext.Request.GetRequestContext().Principal as ClaimsPrincipal;
if (!IsAuthoticationvalid(claimPrincipal))
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
{
Content = new StringContent("Invalid Authorization-Token")
};
return;
}

if (!IsUserValid(claimPrincipal))
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
{
Content = new StringContent("Invalid User name or Password")
};
return;
}

//Finally role has perpession to access the particular function
if (!IsAuthorizationValid(actionContext, claimPrincipal))
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
{
Content = new StringContent("Permission Denied")
};
return;
}

}
catch (Exception ex)
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
{
Content = new StringContent("Missing Authorization-Token")
};
return;
}

try
{
//AuthorizedUserRepository.GetUsers().First(x => x.Name == RSAClass.Decrypt(token));
base.OnActionExecuting(actionContext);
}
catch (Exception)
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
{
Content = new StringContent("Unauthorized User")
};
return;
}
}

private bool IsAuthoticationvalid(ClaimsPrincipal claimPrincipal)
{
if (claimPrincipal.Identity.AuthenticationType.ToLower() == "bearer"
&& claimPrincipal.Identity.IsAuthenticated)
{
return true;
}
return false;
}

private bool IsUserValid(ClaimsPrincipal claimPrincipal)
{
string userID = claimPrincipal.Identity.GetUserId();
var securityStamp = claimPrincipal.Claims.Where(c => c.Type.Equals("AspNet.Identity.SecurityStamp", StringComparison.OrdinalIgnoreCase)).Single().Value;

var user = _context.AspNetUsers.Where(x => x.userID.Equals(userID, StringComparison.OrdinalIgnoreCase)
&& x.SecurityStamp.Equals(securityStamp, StringComparison.OrdinalIgnoreCase));
if (user != null)
{
return true;
}
return false;
}

private bool IsAuthorizationValid(HttpActionContext actionContext, ClaimsPrincipal claimPrincipal)
{
string userId = claimPrincipal.Identity.GetUserId();
string customerId = (string)actionContext.ActionArguments["CustomerId"];
return AllowedToView(userId, customerId);
}

private bool AllowedToView(string userId, string customerId)
{
var customer = _context.WHERE(x => x.UserId == userId && x.CustomerId == customerId && x.RoleId == '1')
return false;
}
}

关于c# - 基于客户端特定角色的身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50724950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com