我在我的rc1项目中做过:
User.Claims.ElementAt(#).Value
Run Code Online (Sandbox Code Playgroud)
但是在我切换到rtm后它就不再起作用了.当我调试Razor视图时,对象看起来相同,但User.Claims只是空的.不知道原因是什么.
在我的控制器完成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
是否有人使用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
我正在尝试在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的每个请求的原始请求主体.
任何帮助或方向将不胜感激!
编辑: …
我在我的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) 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) 我们有一个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 vNext中创建自定义授权属性,直到我在这篇文章中找到@blowdart的这个优秀答案:
表明授权要求现在是要走的路.答案非常明确,但没有说明如何将参数传递给此要求/策略.
我要做的是移植具有此签名的MVC 5自定义授权属性:
[Autorizacion(Requires = enumPermission.DeleteCustomer)]
Run Code Online (Sandbox Code Playgroud)
因为我使用在后端/前端镜像的一组非常自定义的权限作为枚举/字符串.
由于这些功能仍然没有记录,我觉得有点迷失......有人可以提供指导吗?
提前致谢
我正在.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而且我不知道真正的魔法在哪里发生.
我怎么能做到这一点?
我已使用标准方式在 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
asp.net-core ×5
c# ×4
asp.net-mvc ×3
.net-core ×1
blazor ×1
claims ×1
iis ×1
iis-express ×1
oauth-2.0 ×1
razor ×1
rtm ×1