1

最近この質問をして、カスタム認証属性を正常にセットアップしました。

しかし今、私は API 呼び出しに関して別の壁にぶつかっています。これらの呼び出しも、アクション呼び出しと同じ方法で承認する必要があります。System.Web.Http と System.Web.Mvc Authorize 属性に違いがあることを理解しています。したがって、基本的に同じことを行う別の Api 固有の属性を作成しました。ただし、元の属性で行っているように、ユーザー - プリンシパルと ID の設定に問題があります。

私の属性は、リクエストを承認するために Cookie のいくつかの値をチェックするだけです。属性が Cookie を読み取った後、復号化された Cookie 情報をカスタムのプリンシパル/ID セットアップ内に保存していました。私の Api 呼び出しで、ID からこの情報を取得しようとすると、キャストが失敗し、null 値を受け取ります。

これが私が情報を保存する方法です

アピ

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 には (技術的に) 共通点はありません - たとえ同じように見えても。2 つの個別の属性が必要です。

于 2013-03-01T08:35:58.917 に答える
1

c#から継承できるのは1つのクラスのみであり、各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 に答える