1

我最近问了这个问题并成功设置了我的自定义授权属性。

但现在我在 api 调用方面遇到了另一面墙。我还需要以与操作调用相同的方式授权这些调用。我了解 System.Web.Http 和 System.Web.Mvc Authorize 属性之间存在差异。所以我创建了一个单独的 Api 特定属性,它基本上做同样的事情。但是,我在设置用户 - 主体和身份时遇到了麻烦,就像我在原始属性中所做的那样。

我的属性只需检查 cookie 中的某些值以授权请求,一旦属性读取了 cookie,我将解密的 cookie 信息存储在自定义主体/身份设置中。在我的 Api 调用中,当我从身份中检索此信息时,我的转换失败并且我收到一个空值。

这就是我存储信息的方式

api

HttpContext.Current.User = new MyPrinciple(new MyIdentity(decCookie.Name, decCookie.UserData));

行动

filterContext.RequestContext.HttpContext.User = new MyPrinciple(new MyIdentity(decCookie.Name, decCookie.UserData));

我如何检索我认为是相同的所需信息

(User.principal.Identity as MyIdentity).MyData;

问题

  1. 我真的需要有 2 个单独的属性吗
  2. 对于 Api 属性,如何轻松存储信息以供以后在控制器中使用。或者基本上我不能以这种方式为这些调用实际获取/设置身份?

编辑#1

我找到了如何从我的 ApiController 正确访问我的 cookie 值,我只是缺少对 System.Web >_< 的引用。所以问题#2已经解决了!但#1仍然存在。

4

2 回答 2

3

Web API 和 MVC 没有任何共同点(技术上)——即使它们看起来相同。您需要两个单独的属性。

于 2013-03-01T08:35:58.917 回答
1

您只能从 c# 中继承一个类,并且每个 authorizeattribute 都存在于自己的命名空间中,因此您不能在单个类中进行。

您可以将它保存在一个公共命名空间中,然后调用一个公共类来完成提升。

可能的解决方案(未经测试)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace Common.Attributes
{
public class CustomAuthorize : System.Web.Mvc.AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if (!HttpContext.Current.Request.IsAuthenticated || (HttpContext.Current.User as User) != null)
            return;

        filterContext.HttpContext.User = Authorize.ExtractIdentity(filterContext.HttpContext);
    }
}

public class CustomHttpAuthorize : System.Web.Http.AuthorizeAttribute
{
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        base.OnAuthorization(actionContext);

        if (!HttpContext.Current.Request.IsAuthenticated || (HttpContext.Current.User as User) != null)
            return;

            System.Threading.Thread.CurrentPrincipal = Authorize.ExtractIdentity(filterContext.HttpContext);
        }
    }  
}

public static class Authorize
{
    public static IIdentity ExtractIdentity(HttpContext context)
    {
        // do your magic here
    }
}
}
于 2013-03-01T09:01:03.503 回答