1

いくつかの POCO を作成し、DbContext (FooDbContext) を作成しました。次に、DataService< FooDbContext > calll FooDatService から DataService クラス デバイスを作成しました。Silverlight アプリですべてのデータにアクセスでき、Web ブラウザーを起動すると、期待どおりに URL からアクセスできます。ここで、ログインが成功した後にのみ DataService を許可したいと考えています。

4

2 に答える 2

0

3年前くらいからブログ書いてる

http://netpl.blogspot.com/2010/04/aspnet-forms-authentication-sharing-for.html

フォーム Cookie を再利用して呼び出しを保護し、ログインしているユーザーのみがサービスを呼び出すことができるようにするという考え方です。

于 2013-03-23T09:27:56.193 に答える
0

サービス承認マネージャーを WCF サービスに追加して、サービスの実装を変更することなく、そのサービスのすべてのメソッドとエンドポイントをアクセス制御下に置くことができます。

WCF サービスの作成と開始:

    Uri[] restUris = new Uri[] { new Uri(baseUri, "Api/v1/") };
    // substitute your service host type here. I'm using WCF OData DataServiceHost
    restAPIServiceHost = new DataServiceHost(typeof(API.RestAPIService), restUris);

    var saz = restAPIServiceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>();
    if (saz == null)
    {
        saz = new ServiceAuthorizationBehavior();
        restAPIServiceHost.Description.Behaviors.Add(saz);
    }

    saz.ServiceAuthorizationManager = new MyServiceAuthorizationManager();

    restAPIServiceHost.Open();

上記は、web.config マジックを介して行うこともできます。

MyServiceAuthorizationManager 実装で:

        public class MyServiceAuthorizationManager: System.ServiceModel.ServiceAuthorizationManager
        {
            public override bool CheckAccess(OperationContext operationContext, ref Message message)
            {
                var reqProp = message.Properties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;
                var authHeader = new AuthorizationHeader(reqProp.Headers[HttpRequestHeader.Authorization]);

                bool authorized = // your code to decide if caller is authorized;

                if (!authorized)
                {
                    var webContext = new WebOperationContext(operationContext);
                    webContext.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;

                    // optional: give caller hints where to go to login
                    webContext.OutgoingResponse.Headers.Add( HttpResponseHeader.WwwAuthenticate, String.Format("Bearer realm=\"{0}\"", baseUri.AbsoluteUri));
                }

                return authorized;
            }
        }

このCheckAccessメソッドは、リクエストが WCF 実装メソッドにディスパッチされる前に、WCF サービスによって受信されるすべてのリクエストに対して呼び出されます。

于 2013-04-01T22:28:55.147 に答える