加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – Web Api安全客户端和用户

发布时间:2020-12-16 09:40:48 所属栏目:asp.Net 来源:网络整理
导读:对于创建Web API非常新,我目前正在尝试保护我的API并提出几个问题 基本上我有一个Web API和一个MVC应用程序. API目前有一个名为Account的控制器,它有两种方法Register和Login. MVC应用程序具有相同的控制器和动作,但只是调用api方法. 现在基本上他们看到它的
对于创建Web API非常新,我目前正在尝试保护我的API并提出几个问题

基本上我有一个Web API和一个MVC应用程序. API目前有一个名为Account的控制器,它有两种方法Register和Login. MVC应用程序具有相同的控制器和动作,但只是调用api方法.

现在基本上他们看到它的方式,我只希望我的MVC应用程序使用Web API,所以生病了MVC应用程序webconfig中的api密钥每次传递给API?用户还需要在传递用户详细信息的同时进行身份验证吗?

这是否意味着我需要设置两个AuthAttributes?一个用户和一个api详细信息?

编辑

更进一步的这个例子,并展示我需要的东西

我有一个WebUI,它有一个名为CreateTeam的控制器.这会将Team模型传递给api Controller方法CreateTeam,api方法要求用户有权创建团队.现在这个工作正常,但….

我的api上还有一个名为LeaguesController的控制器,它有一个方法AddNewTeamsToLeagues.现在我有一个控制台应用程序,每小时运行一次,在api上调用此方法,以便向联盟添加新的团队.现在我不希望任何人在api上调用此方法,我只希望控制台应用程序能够使用它.什么是保证这一点的最佳方法?

解决方法

一种解决方案是使用[AntiForgeryValidation]生成的令牌(Razor助手是@ Html.AntiForgeryToken).您可以使用以下令牌(在MVC视图中生成)来协助验证(如果您愿意)(或者非常有帮助)或使用您自己的:

<input name="__RequestVerificationToken" type="hidden" value="some-generated-value" />

如果您正在使用jQuery,则可以覆盖默认的Ajax选项(jQuery.ajaxSetup() – API documentation)以自动将其添加到您的请求标头并对其进行验证(无论您需要什么实现).您还可以明确地发送用户名和其他任何您想要验证的用户.

然后,您可以使用AntiForgery.Validate(cookieValue,request.Headers [“__ RequestVerificationToken”]);来使您的Web API具有针对此信息(以及您想要的任何其他内容)验证的过滤器.

不幸的是,在MVC6 / Web API3之前,两种控制器类型具有完全不同的实现,因此您可能必须自己编写客户过滤器来处理身份验证. MVC和Web API都有专用的[Authorize]属性,但它们具有不同的名称空间(System.Web.Http.AuthorizeAttribute vs System.Web.Mvc.AuthorizeAttribute).

希望这可以帮助.如需进一步阅读,请查看this blog post.

– 编辑以回复有关您的控制台应用程序的更新评论 –

您始终可以创建仅允许本地连接,特定IP地址,某些LDAP / AD安全组等访问特定控制器/控制器操作的过滤器.在您的控制台应用程序的情况下,您需要决定如何保护它;一旦你决定你可以从那里去.因此,假设您只想允许AD安全组的特定成员访问控制器,您可以将过滤器放在一起,如下所示:

namespace YourAppName.Filters
{
    public class AuthorizeADAttribute : AuthorizeAttribute
    {
        public string Groups { get; set; }
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (base.AuthorizeCore(httpContext))
            {

                var groups = Groups.Split(',').ToList();
                var context = new PrincipalContext(ContextType.Domain,"YourDomainHere");
                var userPrincipal = UserPrincipal.FindByIdentity(
                                       context,IdentityType.SamAccountName,httpContext.User.Identity.Name);
                foreach (var group in groups)
                    if (userPrincipal.IsMemberOf(context,IdentityType.Name,group))
                        return true;
            }
            return false;
        }
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                var result = new ViewResult();
                result.ViewName = "NotAuthorized";
                result.MasterName = "_Layout";
                filterContext.Result = result;
            }
            else
                base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

然后将其应用于控制器或控制器内部的方法,如下所示:

[AuthorizeAD(Groups = "SecurityGroupToAuth,League Admins,Console App Group")]
public YourViewModelHere AddNewTeamsToLeagues()
{
    // do stuff
}

因此,回答您的初始问题:您可能需要两种不同的属性/过滤器用于不同类型(在处理AntiforgeryToken和控制台应用程序之间).遗憾的是,在不知道您的应用程序和控制台应用程序是如何托管的情况下(不同的机器,同一子网,在同一网络上等),我无法提供更多信息,但希望这有助于指明您创建自己的过滤器/属性的正确方向(S).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读