使用新的ASP.NET Web API测试版.我似乎无法获得建议的用户身份验证方法.建议的方法似乎是,将[Authorize]
过滤器添加到API控制器.例如:
[Authorize]
public IEnumerable<Item> Get()
{
return itemsService.GetItems();
}
Run Code Online (Sandbox Code Playgroud)
但这并不像预期的那样有效.请求资源时,您将被重定向到登录表单.哪个不适合RESTful webapi.
我该怎么办呢?它在未来的版本中会有不同的工作吗?或者我应该回到实现我自己的动作过滤器?
我很难理解[Authorize]
ASP.NET MVC 中属性的实际使用.根据概念,如果我们使用[Authorize]
属性修饰控制器方法,则只允许经过身份验证的用户访问控制器.
我开发了一个ASP.NET MVC应用程序,没有用[Authorize]
属性装饰控制器.我观察到的是,如果我使用web.config或其他方式在我的应用程序中正确实现身份验证机制,那么我现在可以访问{controller}/{action}/{id}
特定操作方法的URL .
系统总是要求登录.这意味着我的控制器是安全的.我的问题是,当我可以在不使用[Authorize]
属性的情况下保护我的控制器时,它的真正需求是什么?
我对ASP.NET MVC的理解是,对于授权,我应该使用类似的东西 -
public class IPAuthorize : AuthorizeAttribute {
protected override bool AuthorizeCore(HttpContextBase httpContext) {
//figure out if the ip is authorized
//and return true or false
}
Run Code Online (Sandbox Code Playgroud)
但在Web API中,没有AuthorizeCore(..)
.
有OnAuthorization(..)
和MVC的一般建议是不使用OnAuthorization(..)
.
我应该在Web API中使用什么来进行自定义授权?
我想从wep api actionfilter返回一个json对象.我怎样才能做到这一点?
我可以从操作返回对象,但我需要在某些条件下从actionfilter返回一些数据.
提前致谢.
编辑:1当我更改如下代码时,浏览器仍然加载没有任何响应,并以超时错误结束.
public class ValidationActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var modelState = actionContext.ModelState;
if (!modelState.IsValid)
{
List<string> arr = new List<string>();
foreach (var key in modelState.Keys)
{
var state = modelState[key];
if (state.Errors.Any())
{
string er = state.Errors.First().ErrorMessage;
if (!string.IsNullOrEmpty(er))
{
arr.Add(er);
}
}
}
var output = new Result() { Status = Status.Error.ToString(), Data = null, Message = arr };
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, output, actionContext.ControllerContext.Configuration.Formatters.JsonFormatter);
}
}
}
Run Code Online (Sandbox Code Playgroud) 简而言之,是否可以在我的API上放置基于环境的授权属性,以便在开发中关闭授权限制并在生产中重新启用?
我有一个单独的Angular 2项目,我希望将其称为.NET Core API.我们创建了一个单独的项目,因此我们可以在vscode中打开Angular 2项目并调试typescript.完成后,出于安全原因,我们将构建项目并将其放在.NET Core项目中.
我们的问题是在调试阶段,我们无法连接到API,因为它们是两个独立的项目,而我们的Angular 2项目没有Active Directory..NET Core项目当前具有身份验证属性,并且不允许访问API(401).如果我们能够在开发过程中关闭它并在生产过程中重新开启,那将是很好的.
我也对如何最好地解决这个问题提出任何其他建议.
[Authorize: (Only in Production)] <-- // something like this???
[Route("api/[controller]")]
public class TestController : Controller
{
...
Run Code Online (Sandbox Code Playgroud) 我们最近通过使用存储在Azure文档数据库中的凭据实现自定义AuthorizationFilterAttribute来实现API身份验证.DocDB要求一切都使用Async.
通过实验我们发现WebApi2同步控制器将使用OnAuthorizationAsync(如果存在),OnAuthorization(如果没有异步方法).我们还发现asyc控制器方法可以使用auth方法.但我不是百分之百确定它是否正常工作.我们只看到代码确实遇到了断点.
奇怪的是,您也可以覆盖OnAuthorization将其标记为异步
公共异步覆盖任务OnAuthorization(....)
最后一个方法编译并执行正常,但控制器不会等待auth过滤器在action方法开始之前完成执行.通常结果是ASP错误:
在异步操作仍处于挂起状态时完成异步模块或处理程序
似乎这种操作覆盖应该是编译错误,不允许.
无论如何......有很多关于AuthorizationFilterAttribute的谜团,还有一些关于混淆的帖子. Asp.net WebApi中的自定义授权 - 真是一团糟?
我的问题是你怎么知道哪个会执行以及哪个优先顺序?如果两者都存在于过滤器中,则会出现,只执行一个方法.
如果您的控制器操作是异步的,您是否必须覆盖OnAuthorizationAsync方法?
如果你在auth逻辑中有async await,并且被迫使用OnAuthorizationAsync(就像我一样),那么这是否意味着我必须将所有控制器操作更改为现在都是异步控制器操作?
我找不到任何说明异步操作过滤器方案的文档.
我正在使用ASP.NET MVC 5构建一个Intranet应用程序.
我的目标是对Active Directory所做的任何用户进行身份验证(即我使用"Windows身份验证"),然后将组添加到应用程序内的任何用户(不使用域组).
我在这里找到了一些非常有趣的代码:
http://brockallen.com/2013/01/17/adding-custom-roles-to-windows-roles-in-asp-net-using-claims/
但它在我的场景中不起作用:当我使用[Authorize(Role ="AppRole")]装饰控制器时,即使用户(使用声明)与"AppRole"角色相关联,我也无法获得授权.
这是我的代码:
在Global.asax.cs中
void Application_PostAuthenticateRequest()
{
if (Request.IsAuthenticated)
{
string[] roles = Utils.GetRolesForUser(User.Identity.Name);
var id = ClaimsPrincipal.Current.Identities.First();
foreach (var role in roles)
{
//id.AddClaim(new Claim(ClaimTypes.Role, role.ToString()));
id.AddClaim(new Claim(ClaimTypes.Role, @"Kairos.mil\Compliance"));
}
bool pippo = User.IsInRole("Compliance");
HttpContext.Current.User = (IPrincipal)id ;
bool pippo2 = User.IsInRole("Compliance");
}
}
Run Code Online (Sandbox Code Playgroud)
函数GetRolesForUser如下(并且工作正常):
public static string[] GetRolesForUser(string username)
{
dbOrdiniPersonaliEntities db = new dbOrdiniPersonaliEntities();
string utente = StripDomain(username);
string[] gruppi = new string[db.vGruppiUtentis.Where(t => t.KairosLogin == utente).Count()];
int i=0;
foreach …
Run Code Online (Sandbox Code Playgroud) 我需要使用Active Directory中的一个或多个特定用户来保护我的Web api,在web.config中,我具有以下代码:
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<section name="users" type="System.Configuration.NameValueFileSectionHandler,System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
<users>
<add key="user" value="domain\loginname" />
</users>
<system.web>
<authentication mode="Windows" />
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
</system.web>
Run Code Online (Sandbox Code Playgroud)
然后,我有一个自定义授权属性,该属性从上面显示的web.config部分读取用户。
public class MyAuthorizeAttribute : AuthorizeAttribute
{
public MyAuthorizeAttribute(params string[] userKeys)
{
List<string> users = new List<string>(userKeys.Length);
var allUsers = (NameValueCollection)ConfigurationManager.GetSection("users");
foreach (var userKey in userKeys)
{
users.Add(allUsers[userKey]);
}
this.Users = string.Join(",", users);
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
bool …
Run Code Online (Sandbox Code Playgroud) c# ×4
asp.net ×3
asp.net-mvc ×3
angular ×1
api ×1
asp.net-core ×1
asynchronous ×1
azure ×1
rest ×1