Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Blazor wasm-在何处检查用户权限_C#_Authorization_Blazor_Blazor Webassembly - Fatal编程技术网

C# Blazor wasm-在何处检查用户权限

C# Blazor wasm-在何处检查用户权限,c#,authorization,blazor,blazor-webassembly,C#,Authorization,Blazor,Blazor Webassembly,使用带有asp.net服务器的Blazor Web Assembly Web应用程序,我想筛选用户可以看到/更改/使用的表单/输入。即,没有权限的匿名或登录用户不得查看或修改选择表单(组合框)。 该页面显示有关特定区域的信息(同一页面用于不同区域,但使用url中的输入指定区域)。如果用户没有权限,则只允许使用基本视图。如果用户来自该区域(区域索赔值),并且具有“提升”角色,则会显示更高级的视图。如果我只想检查用户角色,例如“Admin”,那么它可以正常工作: 在服务器上: private asy

使用带有asp.net服务器的Blazor Web Assembly Web应用程序,我想筛选用户可以看到/更改/使用的表单/输入。即,没有权限的匿名或登录用户不得查看或修改选择表单(组合框)。 该页面显示有关特定区域的信息(同一页面用于不同区域,但使用url中的输入指定区域)。如果用户没有权限,则只允许使用基本视图。如果用户来自该区域(区域索赔值),并且具有“提升”角色,则会显示更高级的视图。如果我只想检查用户角色,例如“Admin”,那么它可以正常工作:

在服务器上:

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;
}
[HttpPost(“IsUserLevelatedAndFromArea”)]
公共异步任务IsUserLevelatedAndFromArea(UserSiteDTO userDTO)
{
if(string.IsNullOrWhiteSpace(userDTO.AreaID)
||string.IsNullOrWhiteSpace(userDTO.UserID))
{
返回false;
}
var user=await\u userManager.FindByIdAsync(userDTO.UserID);
var claims=await_userManager.GetClaimsAsync(用户);
var areaOk=false;
var adminOk=false;
foreach(索赔中的风险值c)
{
如果(c.Type==“区域ID”)
{
如果(!string.IsNullOrWhiteSpace(c.Value)&&c.Value==userDTO.AreaID)
{
areaOk=true;
}
}
如果(c.Type==“AreaAdmin”)
{
如果(!string.IsNullOrWhiteSpace(c.Value)| | c.Value==“Yes”)
{
adminOk=true;
}
}
}
返回区域OK&&adminOk;
}
结合razor代码中的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>
}
@if(_viewPriviliges==viewPriviliges.AreaAdmin)
{
秘密选择:
A.
B
}
另一个选项是将服务器代码“烘焙”到razor.cs代码中,以在webassembly中运行检查


因此,我的问题是,在页面的代码(浏览器中的webassembly)中检查此信息是否安全,或者是否应该通过http get/post调用调用服务器来完成此操作???

否在浏览器中不安全。浏览器应该只看到客户端有哪些权限。此外,客户端的硬件确实未知,因此对数据进行排序和筛选的性能能力值得怀疑。

不,在浏览器中不安全。浏览器应该只看到客户端有哪些权限。此外,客户端的硬件确实未知,因此对数据进行排序和筛选的性能能力值得怀疑。

尝试使用此内置组件-授权视图:

<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>

您好,@context.User.Identity.Name!
只有经过身份验证,才能查看此内容

身份验证失败! 你还没有登录


但正如@Brian Parker所指出的,这只是一种方便。由于您的应用程序是在客户机上运行的,因此实际上不存在安全性,因为所有安全措施都可以绕过。换句话说,您需要确保在API中设置了安全措施,以便不会向客户端传递不安全的数据。

尝试使用此内置组件-授权视图:

<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>

您好,@context.User.Identity.Name!
只有经过身份验证,才能查看此内容

身份验证失败! 你还没有登录


但正如@Brian Parker所指出的,这只是一种方便。由于您的应用程序是在客户机上运行的,因此实际上不存在安全性,因为所有安全措施都可以绕过。换句话说,您需要确保您的安全措施在API中到位,这样就不会向客户端传递不安全的数据。

我已经按照abbove所述在中使用了buildt,但我需要更细粒度的角色和其他声明的过滤组合。但是谢谢你对安全问题的评论。我已经在abbove中使用了buildt,但是我需要角色和其他声明的更细粒度的过滤组合。但是谢谢你对安全问题的评论。