相关疑难解决方法(0)

如何在Asp.Net Core Razor View中获取声明

我在我的rc1项目中做过:

User.Claims.ElementAt(#).Value
Run Code Online (Sandbox Code Playgroud)

但是在我切换到rtm后它就不再起作用了.当我调试Razor视图时,对象看起来相同,但User.Claims只是空的.不知道原因是什么.

asp.net-mvc rtm claims razor .net-core-rc1

15
推荐指数
2
解决办法
1万
查看次数

OnActionExecuted在Web API中被调用两次

在我的控制器完成OnActionExecuted的操作后,我正在尝试做一些事情.但是该方法被调用两次.

我的过滤方法

public class TestFilter: ActionFilterAttribute
{
  public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {

       //do stuff here


    }
}
Run Code Online (Sandbox Code Playgroud)

和我的控制器

[TestFilter]
  public class BaseController : ApiController
{
 public LoginResponseDTO Login(LoginRequestDTO loginRequestDTO)
    {

 //do login stuff
    }

}
Run Code Online (Sandbox Code Playgroud)

当我尝试这个过滤器时,onActionExecuted方法被调用两次,这导致我在方法中的操作被应用两次到响应.我搜索了一个原因但找不到解决方案.

有任何想法吗?

asp.net-mvc onactionexecuted actionfilterattribute asp.net-web-api

13
推荐指数
1
解决办法
6845
查看次数

ASP.NET Core 2.0 - 将LDAP组转换为角色的Windows身份验证

是否有人使用IIS中的Windows身份验证成功创建了一个ASP.NET Core 2.0应用程序来查询LDAP源(内部AD实例)并将组成员身份放入角色作为声明以正确地为[授权]注释加油?中间件的文档没有直接解决如何执行此操作或在某些版本的System.DirectoryServices 4.5preview for aspnetcore中的日期.我知道.NET Framework通过System.DirectoryService为我们提供了对组成员身份的本机访问.我的问题是你是否可以尝试使用过滤器而不是中间件,并为组查询LDAP并将其存储为cookie中的声明.有更简单的方法吗?我查询了在Novell.Directory.Ldap标准中工作的LDAP源,我可以在适当的地方使用迭代.

提前感谢您的建议.

authentication iis active-directory iis-express asp.net-core

13
推荐指数
1
解决办法
766
查看次数

访问原始请求正文

我正在尝试在ASP.net 5中访问请求的原始输入正文/流.过去,我能够将输入流的位置重置为0并将其读入内存流但是当我尝试这样做时从上下文中,输入流为null或抛出错误(System.NotSupportedException =>"不支持指定的方法.").

在下面的第一个示例中,如果我将控制器方法的参数对象类型声明为动态,则可以在控制器中访问原始请求.由于各种原因,这不是一个解决方案,我需要在身份验证过滤器中访问原始请求正文.

此示例有效,但不是一个合理的解决方案:

[HttpPost("requestme")]
public string GetRequestBody([FromBody] dynamic body)
{   
    return body.ToString();
}
Run Code Online (Sandbox Code Playgroud)

引发错误:

[HttpPost("requestme")]
public string GetRequestBody()
{
    var m = new MemoryStream();
    Request.Body.CopyTo(m);

    var contentLength = m.Length;

    var b = System.Text.Encoding.UTF8.GetString(m.ToArray());

    return b;
}
Run Code Online (Sandbox Code Playgroud)

引发错误:

[HttpPost("requestme")]
public string GetRequestBody()
{
    Request.Body.Position = 0;
    var input = new StreamReader(Request.Body).ReadToEnd();

    return input;
}
Run Code Online (Sandbox Code Playgroud)

引发错误:

[HttpPost("requestme")]
public string GetRequestBody()
{
    Request.Body.Position = 0;
    var input = new MemoryStream();
    Request.Body.CopyTo(input);

    var inputString = System.Text.Encoding.UTF8.GetString(input.ToArray());

    return inputString;
}
Run Code Online (Sandbox Code Playgroud)

我需要访问我正在构建的API的每个请求的原始请求主体.

任何帮助或方向将不胜感激!

编辑: …

asp.net-core-mvc asp.net-core asp.net-core-webapi

11
推荐指数
2
解决办法
2万
查看次数

在Web API中创建自定义AuthorizeAttribute(.Net Framework)

我在我的WebAPI中使用OAuth2.0 Owin(密码授权).我的初始令牌响应如下所示

{
    "access_token": "_ramSlQYasdsRTWEWew.....................",
    "token_type": "bearer",
    "expires_in": 17999,
    "permissions": {
        "user": [
            "Add",
            "Update",
            "Delete"
        ],
        "Product": [
            "Read",
            "Create"
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

我通过创建一个名为" 持有相应用户权限" 的新密钥来自定义响应permissions.

从这里我需要Resource server通过检查用户是否具有使用授权属性调用API的足够权限来验证来自我的每个请求.

我在这里找到了一个类似的例子,它涉及Dot net Core,这不适合我的情况.

困难的部分是permissionJSON Key本身就是一个复杂的ArrayList

[CustomAuthorize(PermissionItem.Product, PermissionAction.Read)]
    public async Task<IActionResult> Index()
    {
        return View(Index);
    }

public class CustomAuthorize : AuthorizeAttribute {
    public AuthorizeAttribute (PermissionItem item, PermissionAction action) {
        //Need to initalize the Permission Enums
    }
    public override void OnAuthorization (HttpActionContext …
Run Code Online (Sandbox Code Playgroud)

c# authorize-attribute oauth-2.0 asp.net-web-api2

10
推荐指数
1
解决办法
8318
查看次数

如何为 Blazor 页面实现自定义授权过滤器

Blazor 服务器端,.NET Core 3.1.x 查看有关授权的示例,我正在尝试获取自定义授权过滤器/属性的解决方案。我只需要在授权期间检查用户身份。

https://learn.microsoft.com/en-us/aspnet/core/security/blazor/?view=aspnetcore-3.1

在 Blazor 页面顶部,@page 之后

@attribute [MyAuthFilter]
Run Code Online (Sandbox Code Playgroud)

过滤器。然而,OnAuthorization 永远不会受到影响。

public class MyAuthFilter: AuthorizeAttribute,IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var httpContext = context.HttpContext;


        // get user name
        string userName = httpContext.User.Identity.Name;

        // todo - call method to check user access
        // check against list to see if access permitted
        //context.Result = new UnauthorizedResult();

    }
}
Run Code Online (Sandbox Code Playgroud)

c# blazor blazor-server-side

10
推荐指数
1
解决办法
1万
查看次数

ASP.NET核心中基于活动的授权

我们有一个asp.net mvc应用程序,我正在移植到aspnet核心mvc.在旧解决方案中,使用Windows身份验证完成身份验证.

最重要的是,我们有一个"基于活动的身份验证"(如http://ryankirkman.com/2013/01/31/activity-based-authorization.html); 用户连接到角色,角色连接到权限.用户角色和相应的权限存储在单独的应用程序中,该应用程序用作我们的应用程序和少数其他系统的授权服务.

对授权服务api查询用户"Jon Doe"的权限会得到如下响应:

{
    Email:"Jon.Doe@acme.com",
    FirstName:"Jon",
    LastName:"Doe",
    Resources:
    [
        "CanAccessWebApplication",
        "CanCopyAppointment",
        "CanEditAppointment",
        "CanEditContact",
        "CanSaveContact"
        ...
    ]
    Alias:"1234567",
    UserId:"1234"
}
Run Code Online (Sandbox Code Playgroud)

在我们当前的应用程序中,使用控制器方法上的属性(我们已经实现了自己)来检查这些权限:

public ContactController
{
     [ActionUserAccess("CanSaveContact")]
     public ActionResult SaveContact
     {
       ...
     }
}
Run Code Online (Sandbox Code Playgroud)

ActionUserAccessAttribute过滤器的当前遗留实现如下所示:

    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
    public sealed class ActionUserAccessAttribute : ActionFilterAttribute
    {
        private readonly string _accessRight;

        public ActionUserAccessAttribute(string accessRight)
        {
            _accessRight = accessRight;
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                throw new InvalidOperationException("ActionUserAccessAttribute can not be used for controllers or actions …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc authorization .net-core asp.net-core

8
推荐指数
1
解决办法
2554
查看次数

将参数传递给ASP.NET MVC 6中的需求/策略

我试图在ASP.NET vNext中创建自定义授权属性,直到我在这篇文章中找到@blowdart的这个优秀答案:

/sf/answers/2202565921/

表明授权要求现在是要走的路.答案非常明确,但没有说明如何将参数传递给此要求/策略.

我要做的是移植具有此签名的MVC 5自定义授权属性:

[Autorizacion(Requires = enumPermission.DeleteCustomer)]
Run Code Online (Sandbox Code Playgroud)

因为我使用在后端/前端镜像的一组非常自定义的权限作为枚举/字符串.

由于这些功能仍然没有记录,我觉得有点迷失......有人可以提供指导吗?

提前致谢

asp.net-core-mvc asp.net-core

7
推荐指数
1
解决办法
2899
查看次数

.NET Core中的自定义授权属性

我正在.NET Core 1.1中构建一个API.我在基本控制器中构建了一个自定义User对象HttpContext.User,我的所有其他控制器都是从该控制器继承的,并且我默认启用了身份验证(必须[AllowAnonymous]在必要时手动禁用).该User对象具有IsAdmin属性.现在我正在检查用户是否是每个相关功能顶部的管理员,如下所示,但我觉得必须有一种方法来添加自定义属性来简化和清理此代码.

供参考,User.IsAdmin是这方面的简写:

bool.Parse(HttpContext.User.FindFirst("IsAdmin")?.Value)
Run Code Online (Sandbox Code Playgroud)

而不是这个:

[HttpGet]
public async Task<IActionResult> Get()
{
    if (!User.IsAdmin)
        return Forbid();

    // logic
}
Run Code Online (Sandbox Code Playgroud)

我喜欢这个(或类似的东西):

[AdminOnly]
[HttpGet]
public async Task<IActionResult> Get()
{
    // logic
}
Run Code Online (Sandbox Code Playgroud)

我试着查看源代码[AuthorizeAttribute]来尝试构建,但它只是一个shell而且我不知道真正的魔法在哪里发生.

我怎么能做到这一点?

c# asp.net-core-mvc asp.net-core asp.net-core-webapi

7
推荐指数
1
解决办法
6533
查看次数

ASP.Net Core 6 中具有自定义授权的 Azure AD 身份验证

我已使用标准方式在 ASP.Net Core 6 中实现了 Azure AD 身份验证,并在控制器类顶部使用了 [Authorize] 属性。所有这些都工作正常。

builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration, "AzureAd");
Run Code Online (Sandbox Code Playgroud)

除了身份验证之外,我还尝试使用 TypeFilterAttribute 类构建自定义授权。代码片段如下:

public class CustomAuthorizeAttribute : TypeFilterAttribute
{
    public CustomAuthorizeAttribute(params Roles[] roles) : base(typeof(CustomAuthorizeFilter))
    {
        Roles[] _roles = roles;
        Arguments = new object[] { _roles };
    }
}

public class CustomAuthorizeFilter : IAuthorizationFilter
{
    private readonly Roles[] _roles;
    private readonly IUserService _userService;

    public CustomAuthorizeFilter(Roles[] roles, IUserService userService)
    {
        _roles = roles ?? throw new UnauthorizedAccessException("OnAuthorization : Missing role parameter");
        _userService = userService;
    }

    public async void OnAuthorization(AuthorizationFilterContext …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-authorization azure-active-directory asp.net-core-webapi

7
推荐指数
1
解决办法
1623
查看次数