小编Jam*_*mer的帖子

AllowAnonymous不使用Custom AuthorizationAttribute

这让我难以忍受了一段时间.通常遇到的类似情况似乎都不适用于此.我可能错过了一些明显但我看不到的东西.

在我的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)

任何想法都会非常感激.

有没有人遇到过这个问题,找到根本原因?

authentication asp.net-mvc attributes asp.net-web-api

51
推荐指数
3
解决办法
3万
查看次数

AJAX将没有表单的ValidateAntiForgeryToken发布到MVC操作方法

我一直在寻找如何在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)

asp.net-mvc jquery json

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

注册.NET 4.5 IIS 10 Windows 10

我一直在看这几个小时,我无法修复它.

我有一个.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工作?

.net asp.net iis

20
推荐指数
3
解决办法
4万
查看次数

HATEOAS Rel - 任何标准呢?

我刚刚开始为我正在构建的WebAPI编写客户端实现.API已经使用了HATEOAS,因此我正在相应地编写客户端.我正在使用RestSharp作为客户端的基础.

客户端在构建时传递api base url(" https:// myapi/start "),它会触发请求,然后传递一组uris用于其他可用资源 - 授权(" https:// myapi /授权 ")并请求访问令牌(" https:// myapi/tokens ")以授权其调用api上的安全资源.

问题是,是否已针对返回的超媒体中的rel =""要求制定了标准?

rest http hyperlink hateoas asp.net-web-api

18
推荐指数
4
解决办法
9439
查看次数

LINQ和AutoMapper

我想知道我能做些什么来让它按预期工作.这在我的代码中工作正常:

        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'方法,并且此方法无法转换为商店表达式"

我不确定我是否能对这个'问题'做任何事情......可以说无论如何,有效的方法更具可读性......

c# linq entity-framework automapper

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

jQuery Grep替代方案返回一个项目

我正在看一些我正在写的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返回一个数组,而不是它是一个查找类型函数,它是一个过滤器类型函数,所以我猜问题应该是一个只返回一个项而不是一个数组的函数?

javascript jquery

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

在WebAPI中使用自定义IHttpActionInvoker进行异常处理

我正在尝试将自定义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)

我想我有两个问题.

  1. 考虑到编写自定义IHttpActionInvoker类没有被认为是一个很糟糕的问题,这被认为是解决WebAPI应用程序中的异常处理的好方法吗?

  2. 有谁知道为什么我在执行Remove()方法时会遇到这样的异常以及如何最好地解决这个特定问题?

c# asp.net-mvc asp.net-web-api

11
推荐指数
1
解决办法
4306
查看次数

WiX Heat.exe Win64组件 - Win64 ="是"

我目前正在构建一个仅针对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,但这似乎不起作用.

非常困惑.

windows-installer wix

11
推荐指数
3
解决办法
5388
查看次数

Xamarin MvvmCross ViewModel验证

我正在构建我的第一个Xamarin MvvmCross应用程序,目前我正在考虑验证用户对视图模型的输入.

对这个插件进行大量搜索(包括MvvmCross团队)链接:

MVVMCross.Plugins.Validation

这个插件使用了很老版本的MvvmCross v3.我已经尝试从这个插件中获取代码并将其直接构建到我的应用程序Core项目中,直到我遇到Bindings的变化.然后我得出结论,这个插件实际上需要完全重写,因为这样才能使用最新版本的MvvmCross.

所以我现在有点卡住了.

目前推荐的在视图模型中执行输入验证的最佳方法是什么?

validation mvvm mvvmcross xamarin

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

ASP.NET Identity UserManager UpdateAsync删除角色

我们的应用程序中有一个屏幕,允许管理员角色的成员编辑用户帐户详细信息.

最终,任何用户对象都将发送到服务器并使用以下方式进

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);我所看到的方法的不一致行为.它显然有效,或者永远无法向用户添加任何角色.

到达服务器的对象每次提交时都会正确填充角色.基本流程是:

  1. 添加角色并提交
  2. 该角色正确添加到用户
  3. 添加其他角色并提交
  4. 所有角色都被删除

如何防止它删除角色?

谢谢!

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方法之前,正在更新的用户对象具有正确的角色列表.

c# asp.net-core asp.net-core-identity

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