这让我难以忍受了一段时间.通常遇到的类似情况似乎都不适用于此.我可能错过了一些明显但我看不到的东西.
在我的Mvc Web应用程序中,我使用Authorize和AllowAnonymous属性,这样您就必须明确地将操作打开为公开可用,而不是锁定站点的安全区域.我更喜欢这种方法.但是,我无法在WebAPI中获得相同的行为.
我编写了一个自定义的授权属性,它继承自System.Web.Http.AuthorizeAttribute,具有以下内容:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class MyAuthorizationAttribute : System.Web.Http.AuthorizeAttribute
Run Code Online (Sandbox Code Playgroud)
我将此注册为过滤器:
public static void RegisterHttpFilters(HttpFilterCollection filters)
{
filters.Add(new MyAuthorizationAttribute());
}
Run Code Online (Sandbox Code Playgroud)
这一切都按预期工作,没有凭据就不再提供操作.问题是现在以下方法不允许AllowAnonymous属性执行此操作:
[System.Web.Http.AllowAnonymous]
public class HomeController : ApiController
{
[GET("/"), System.Web.Http.HttpGet]
public Link[] Index()
{
return new Link[]
{
new SelfLink(Request.RequestUri.AbsoluteUri, "api-root"),
new Link(LinkRelConstants.AuthorizationEndpoint, "OAuth/Authorize/", "authenticate"),
new Link(LinkRelConstants.AuthorizationTokenEndpoint , "OAuth/Tokens/", "auth-token-endpoint")
};
}
}
Run Code Online (Sandbox Code Playgroud)
最常见的情况似乎是将两个Authorize/AllowAnonymous属性混淆.System.Web.Mvc适用于Web应用程序,System.Web.Http适用于WebAPI(无论如何我都理解).
我正在使用的两个属性来自相同的命名空间--System.Web.Http.我假设这将继承基本功能,并允许我在OnAuthotize方法中注入我需要的代码.
根据文档,AllowAnonymous属性在我立即调用的OnAuthorize方法内部工作:
public override void OnAuthorization(HttpActionContext actionContext)
{
base.OnAuthorization(actionContext);
Run Code Online (Sandbox Code Playgroud)
任何想法都会非常感激.
有没有人遇到过这个问题,找到根本原因?
我一直在寻找如何在SO上做到这一点的例子,据我所知,我已经尝试了所有可以找到但迄今为止没有成功的例子.我已经尝试将一些实现改为我的场景,但迄今为止也失败了.
我在_layout.cshtml的页面上有这个,所以我总是有一个令牌:
<form id="__AjaxAntiForgeryForm" action="#" method="post"> @Html.AntiForgeryToken()</form>
Run Code Online (Sandbox Code Playgroud)
我的JavaScript utils文件中也有这个方法:
AddAntiForgeryToken = function (data) {
data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
return data;
};
Run Code Online (Sandbox Code Playgroud)
这一切都按预期工作,我得到一个防伪标记.我的实际发布代码是:
myPage.saveData = function() {
var saveUrl = '/exercises/PostData';
var myData = JSON.stringify(myPage.contextsArrays);
$.ajax({
type: 'POST',
async: false,
url: saveUrl,
data: AddAntiForgeryToken({ myResults: myData }),
success: function () {
alert('saved');
},
dataType: 'json',
contentType: "application/json; charset=utf-8"
});
};
Run Code Online (Sandbox Code Playgroud)
我的动作方法如下所示:
[HttpPost, ValidateAntiForgeryToken, JsonExceptionFilter]
public JsonResult PostData(List<ResultsDc> myResults)
{
return Json(_apiClient.SubmitResults(myResults));
}
Run Code Online (Sandbox Code Playgroud)
我一直在尝试使用我一直在尝试的各种实现,并且响应总是:
{"errorMessage":"The required anti-forgery form field \"__RequestVerificationToken\" is not …
Run Code Online (Sandbox Code Playgroud) 我一直在看这几个小时,我无法修复它.
我有一个.NET 4.5网站和API,我正在使用Windows 10.我安装了VS2012 Pro并安装了VS2015社区.
检查Web平台安装程序,它表明我已经安装了.NET 4.5.
每次我打开API或网站解决方案时,它都会告诉我.NET 4.5和IIS没有配置,我的应用程序也不会运行.
我已经尝试按照MS运行这些命令:
dism /online /enable-feature /all /featurename:IIS-ASPNET45
Run Code Online (Sandbox Code Playgroud)
而且我仍然报告了一些错误.我读过的所有内容都指出上述命令应该解决问题,但事实并非如此.除了上面列出的命令之外,我在主题上找不到任何其他内容.
似乎有很多人对这个问题都说同样的事情,但没有可行的解决方案(至少对我而言至今)..NET 4.5未列在Add Features to Windows
.
我如何使这个工作,以便ASP.NET 4.5和IIS工作?
我刚刚开始为我正在构建的WebAPI编写客户端实现.API已经使用了HATEOAS,因此我正在相应地编写客户端.我正在使用RestSharp作为客户端的基础.
客户端在构建时传递api base url(" https:// myapi/start "),它会触发请求,然后传递一组uris用于其他可用资源 - 授权(" https:// myapi /授权 ")并请求访问令牌(" https:// myapi/tokens ")以授权其调用api上的安全资源.
问题是,是否已针对返回的超媒体中的rel =""要求制定了标准?
我想知道我能做些什么来让它按预期工作.这在我的代码中工作正常:
var roles = _securityContext.Set<Role>();
var roleList = new List<RoleDto>();
foreach (var role in roles)
{
roleList.Add(Mapper.Map<Role, RoleDto>(role));
}
return roleList;
Run Code Online (Sandbox Code Playgroud)
但改为:
var roles = _securityContext.Set<Role>();
return roles.Select(role => Mapper.Map<Role, RoleDto>(role)).ToList();
Run Code Online (Sandbox Code Playgroud)
导致我以前没见过的错误:
"LINQ to Entities无法识别方法'Security.Dto.RoleDto MapRole,RoleDto'方法,并且此方法无法转换为商店表达式"
我不确定我是否能对这个'问题'做任何事情......可以说无论如何,有效的方法更具可读性......
我正在看一些我正在写的jQuery代码,它对我的C#大脑看起来很奇怪.有没有更好的方法呢?
var idToLookFor = 2;
var myArray = [{id:1},{id:2},{id:3}]
var arrayItem = $.grep(myArray , function (elm) {
return elm.id == idToLookFor;
});
var itemFound = arrayItem[0];
Run Code Online (Sandbox Code Playgroud)
我可以理解grep返回一个数组,而不是它是一个查找类型函数,它是一个过滤器类型函数,所以我猜问题应该是一个只返回一个项而不是一个数组的函数?
我正在尝试将自定义IHttpActionInvoker添加到我的WebAPI应用程序中,以防止在我的操作方法中需要大量重复的异常处理代码.
除了这篇文章之外,关于如何做到这一点似乎并没有多少.根据文章写了我的IHttpActionInvoker后,我添加了这段代码:
GlobalConfiguration.Configuration.Services.Remove(typeof(IHttpActionInvoker),
GlobalConfiguration.Configuration.Services.GetActionInvoker());
GlobalConfiguration.Configuration.Services.Add(typeof(IHttpActionInvoker),
new MyApiControllerActionInvoker());
Run Code Online (Sandbox Code Playgroud)
进入我的Global.asax文件中的方法.现在,在执行对API的调用时,我在Remove()方法中引发了以下异常:
The service type IHttpActionInvoker is not supported
Run Code Online (Sandbox Code Playgroud)
我想我有两个问题.
考虑到编写自定义IHttpActionInvoker类没有被认为是一个很糟糕的问题,这被认为是解决WebAPI应用程序中的异常处理的好方法吗?
有谁知道为什么我在执行Remove()
方法时会遇到这样的异常以及如何最好地解决这个特定问题?
我目前正在构建一个仅针对64位计算机的安装程序.该过程的一部分涉及运行Heat.exe
以生成Fragment
包含已部署应用程序的一部分的元素.
问题是由热量产生的组件产生ICE:80错误,WiX抱怨组件以32位系统为目标而我的安装程序正在尝试将这些组件加载到:
<Directory Id="ProgramFiles64Folder">
Run Code Online (Sandbox Code Playgroud)
查看文档时-platform
,可以使用一个开关来判断Heat
我们是否针对x64环境,但是文档中没有关于如何使用此开关的线索.我试过了:
-platform=x64
-platform=Win64
Run Code Online (Sandbox Code Playgroud)
似乎没有任何效果影响输出,以便Win64
在生成的组件上设置属性.有没有人想到这个?还是我完全吠叫错了树?
如果我手动编辑收集的组件以添加Win64="yes"
ICE错误就会消失.
在我的<Product>
元素中Platform="x64"
,据我了解它candle
应该采取这一点并确定组件应该默认设置为x64,但这似乎不起作用.
非常困惑.
我正在构建我的第一个Xamarin MvvmCross应用程序,目前我正在考虑验证用户对视图模型的输入.
对这个插件进行大量搜索(包括MvvmCross团队)链接:
这个插件使用了很老版本的MvvmCross v3.我已经尝试从这个插件中获取代码并将其直接构建到我的应用程序Core项目中,直到我遇到Bindings的变化.然后我得出结论,这个插件实际上需要完全重写,因为这样才能使用最新版本的MvvmCross.
所以我现在有点卡住了.
目前推荐的在视图模型中执行输入验证的最佳方法是什么?
我们的应用程序中有一个屏幕,允许管理员角色的成员编辑用户帐户详细信息.
最终,任何用户对象都将发送到服务器并使用以下方式进
await userManager.UpdateAsync(user);
Run Code Online (Sandbox Code Playgroud)
这正在按预期更新用户记录.我们可以对数据库进行持久更改,例如用户名,电话号码等.
我看到的问题是,有时更新角色而不是向用户添加其他角色时,它会删除所有角色.
在我们的ApplicationUser
对象上,我们有这样的属性:
public virtual ICollection<IdentityUserRole<string>> Roles { get; set; } = new List<IdentityUserRole<string>>();
Run Code Online (Sandbox Code Playgroud)
因此,我们可以在客户端和服务器之间作为用户对象的一部分进行反弹.
我正在努力理解的是userManager.UpdateAsync(user);
我所看到的方法的不一致行为.它显然有效,或者永远无法向用户添加任何角色.
到达服务器的对象每次提交时都会正确填充角色.基本流程是:
如何防止它删除角色?
谢谢!
UPDATE
正如@amirani的答案中详述的那样,我尝试过滤现有的列表.我已经设置AutoMapper
完全忽略该属性.
.ForMember(x => x.Roles, opt => opt.Ignore());
Run Code Online (Sandbox Code Playgroud)
我现在只是像这样过滤(目前仅添加):
foreach (var userDtoRole in userDto.Roles)
{
if (user.Roles.FirstOrDefault(x => x.RoleId == userDtoRole) == null)
{
user.Roles.Add(new IdentityUserRole<string> {RoleId = userDtoRole, UserId = user.Id });
}
}
Run Code Online (Sandbox Code Playgroud)
其他角色永远不会添加到基础数据库.我已经确认在执行UpdateUser
方法之前,正在更新的用户对象具有正确的角色列表.
asp.net-mvc ×3
c# ×3
jquery ×2
.net ×1
asp.net ×1
asp.net-core ×1
attributes ×1
automapper ×1
hateoas ×1
http ×1
hyperlink ×1
iis ×1
javascript ×1
json ×1
linq ×1
mvvm ×1
mvvmcross ×1
rest ×1
validation ×1
wix ×1
xamarin ×1