Blazor wasm - 在哪里检查用户权限
Blazor wasm - where to check user privileges
使用带有 asp.net 服务器的 Blazor Web-Assembly Web 应用程序,我想过滤 forms/input 用户可以 see/change/use 的内容。 IE。没有权限的匿名或登录用户不能查看或修改 select 表单(组合框)。
该页面显示有关特定区域的信息(同一页面用于不同的区域,但使用 url 中的输入来指定区域)。如果用户没有权限,则只允许使用基本视图。如果用户来自该区域(区域声明值)并且具有“提升的”角色,则会显示更高级的视图。如果我想检查的只是用户角色,它工作正常,例如“管理员”:
<AuthorizeView Roles="Admin">
<Authorized>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">Secret choise:</span>
</div>
<select @bind="Choise">
<option value=A>A</option>
<option value=B>B</option>
</select>
</div>
</Authorized>
</AuthorizeView>
但与变量值相比,角色和“区域”声明的组合似乎需要更多代码...
使用 razor.cs 代码调用服务器:
private async Task CheckUserViewPriveligesViaServer()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity.IsAuthenticated)
{
var claims = user.Claims;
var userID = user.FindFirst(c => c.Type == "sub")?.Value;
UserSiteDTO userSiteDTO = new UserArea() { AreaID = _area.ID, UserID = userID };
try
{
var canUserViewSensitiveInformation = await UsersReposotory.IsUserElevatedAndFromArea(userSiteDTO); // calls asp.net server
if (canUserViewSensitiveInformation)
{
_viewPriveliges = ViewPriveliges.AreaAdmin;
}
else
{
_viewPriveliges = ViewPriveliges.None;
}
}
catch (Exception)
{
_viewPriveliges = ViewPriveliges.None;
Console.WriteLine("Unable to get user priveliges");
}
}
else
{
_viewPriveliges = ViewPriveliges.None;
}
}
在服务器上:
[HttpPost("isUserElevatedAndFromArea")]
public async Task<ActionResult<bool>> IsUserElevatedAndFromArea(UserSiteDTO userDTO)
{
if (string.IsNullOrWhiteSpace(userDTO.AreaID)
|| string.IsNullOrWhiteSpace(userDTO.UserID))
{
return false;
}
var user = await _userManager.FindByIdAsync(userDTO.UserID);
var claims = await _userManager.GetClaimsAsync(user);
var areaOk = false;
var adminOk = false;
foreach (var c in claims)
{
if (c.Type == "AreaID")
{
if (!string.IsNullOrWhiteSpace(c.Value) && c.Value == userDTO.AreaID )
{
areaOk = true;
}
}
if (c.Type == "AreaAdmin")
{
if (!string.IsNullOrWhiteSpace(c.Value) || c.Value == "Yes")
{
adminOk = true;
}
}
}
return areaOk && adminOk;
}
加上剃刀代码中的 if 语句:
@if (_viewPriveliges == ViewPriveliges.AreaAdmin)
{
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">Secret choise:</span>
</div>
<select @bind="Choise">
<option value=A>A</option>
<option value=B>B</option>
</select>
</div>
}
另一种选择是将服务器代码“烘焙”到 razor.cs 代码中 运行 webassembly 中的检查。
所以,我的问题是,在页面的代码(浏览器中的 webassembly)中检查此信息是否安全明智,或者是否应该通过 http [=28] 调用服务器来完成=]打电话??
不,它在浏览器中不安全。浏览器应该只看到客户端有权访问的内容。而且客户端的硬件确实未知,所以对数据进行排序和过滤的性能值得怀疑。
尝试使用这个内置组件 - 授权视图:
<AuthorizeView>
<Authorized>
<h1>Hello, @context.User.Identity.Name!</h1>
<p>You can only see this content if you're authenticated.</p>
</Authorized>
<NotAuthorized>
<h1>Authentication Failure!</h1>
<p>You're not signed in.</p>
</NotAuthorized>
</AuthorizeView>
但正如@Brian Parker 所指出的,这只是一种方便。由于您在客户端,因此实际上没有安全性之类的东西,因为可以绕过所有安全措施。换句话说,您需要确保您的 API 中的安全措施到位,因此不会将不安全的数据传递给客户端。
使用带有 asp.net 服务器的 Blazor Web-Assembly Web 应用程序,我想过滤 forms/input 用户可以 see/change/use 的内容。 IE。没有权限的匿名或登录用户不能查看或修改 select 表单(组合框)。 该页面显示有关特定区域的信息(同一页面用于不同的区域,但使用 url 中的输入来指定区域)。如果用户没有权限,则只允许使用基本视图。如果用户来自该区域(区域声明值)并且具有“提升的”角色,则会显示更高级的视图。如果我想检查的只是用户角色,它工作正常,例如“管理员”:
<AuthorizeView Roles="Admin">
<Authorized>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">Secret choise:</span>
</div>
<select @bind="Choise">
<option value=A>A</option>
<option value=B>B</option>
</select>
</div>
</Authorized>
</AuthorizeView>
但与变量值相比,角色和“区域”声明的组合似乎需要更多代码... 使用 razor.cs 代码调用服务器:
private async Task CheckUserViewPriveligesViaServer()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity.IsAuthenticated)
{
var claims = user.Claims;
var userID = user.FindFirst(c => c.Type == "sub")?.Value;
UserSiteDTO userSiteDTO = new UserArea() { AreaID = _area.ID, UserID = userID };
try
{
var canUserViewSensitiveInformation = await UsersReposotory.IsUserElevatedAndFromArea(userSiteDTO); // calls asp.net server
if (canUserViewSensitiveInformation)
{
_viewPriveliges = ViewPriveliges.AreaAdmin;
}
else
{
_viewPriveliges = ViewPriveliges.None;
}
}
catch (Exception)
{
_viewPriveliges = ViewPriveliges.None;
Console.WriteLine("Unable to get user priveliges");
}
}
else
{
_viewPriveliges = ViewPriveliges.None;
}
}
在服务器上:
[HttpPost("isUserElevatedAndFromArea")]
public async Task<ActionResult<bool>> IsUserElevatedAndFromArea(UserSiteDTO userDTO)
{
if (string.IsNullOrWhiteSpace(userDTO.AreaID)
|| string.IsNullOrWhiteSpace(userDTO.UserID))
{
return false;
}
var user = await _userManager.FindByIdAsync(userDTO.UserID);
var claims = await _userManager.GetClaimsAsync(user);
var areaOk = false;
var adminOk = false;
foreach (var c in claims)
{
if (c.Type == "AreaID")
{
if (!string.IsNullOrWhiteSpace(c.Value) && c.Value == userDTO.AreaID )
{
areaOk = true;
}
}
if (c.Type == "AreaAdmin")
{
if (!string.IsNullOrWhiteSpace(c.Value) || c.Value == "Yes")
{
adminOk = true;
}
}
}
return areaOk && adminOk;
}
加上剃刀代码中的 if 语句:
@if (_viewPriveliges == ViewPriveliges.AreaAdmin)
{
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">Secret choise:</span>
</div>
<select @bind="Choise">
<option value=A>A</option>
<option value=B>B</option>
</select>
</div>
}
另一种选择是将服务器代码“烘焙”到 razor.cs 代码中 运行 webassembly 中的检查。
所以,我的问题是,在页面的代码(浏览器中的 webassembly)中检查此信息是否安全明智,或者是否应该通过 http [=28] 调用服务器来完成=]打电话??
不,它在浏览器中不安全。浏览器应该只看到客户端有权访问的内容。而且客户端的硬件确实未知,所以对数据进行排序和过滤的性能值得怀疑。
尝试使用这个内置组件 - 授权视图:
<AuthorizeView>
<Authorized>
<h1>Hello, @context.User.Identity.Name!</h1>
<p>You can only see this content if you're authenticated.</p>
</Authorized>
<NotAuthorized>
<h1>Authentication Failure!</h1>
<p>You're not signed in.</p>
</NotAuthorized>
</AuthorizeView>
但正如@Brian Parker 所指出的,这只是一种方便。由于您在客户端,因此实际上没有安全性之类的东西,因为可以绕过所有安全措施。换句话说,您需要确保您的 API 中的安全措施到位,因此不会将不安全的数据传递给客户端。