4

私が取り組んでいるMVC3プロジェクトでは、現在コントローラーにある多くのロジックをサービスレイヤーに移動し、WCFでRESTサービスとして公開しようとしています。

したがって、Global.asaxで、次のようなサービスルートを作成します。

RouteTable.Routes.Add(new ServiceRoute
    ("Exampleservice", new WebServiceHostFactory(), typeof(ExampleService)));

コントローラーは次のようなサービスにアクセスします。

public class ExampleController : Controller {
    private IExampleService service;

    public ExampleController() {
        this.service = new ExampleService();
    } 

    public ActionResult Index() {
         var results = service.GetAll();
         return View(results);
    }
}

ここでの主なポイントは、サービスクラスを直接使用することです(HttpClientを使用してネットワーク経由でリクエストを行うことはありません)。

私たちのウェブサイトはWindows認証(イントラネットサイト)を使用しており、それを維持したいと考えています。私の質問は、サービスを使用するコントローラーの使用方法とWCFによるサービスの使用方法の両方で機能する、サービスクラスのユーザーIDを取得する方法はありますか?

例えば:

[ServiceContract]
public interface IExampleService
{
    [WebGet(UriTemplate = "/")]
    List<Results> GetAll();
}

public class ExampleService : IExampleService
{
     List<Results> GetAll() {
         // Get User Name Here
         // In ASP.Net I would use User.Identity.Name
         // If I was just worrying about the the REST service I would use
         // ServiceSecurityContext.Current.WindowsIdentity.Name
     }
}
4

2 に答える 2

1

@Ryand.Johnsonによって提案された指示は正しいです。ここでのポイントは、コントローラーは、現在ログに記録されているユーザーのIDではなくasp.netユーザーIDで実行されるため、Webサービスに資格情報を送信しないということです。IDをプロキシに渡す唯一の方法は、次のようになりすましコンテキスト内にWebサービスへの呼び出しを埋め込むことです。

using (WindowsImpersonationContext impersonatedUser = (User.Identity as System.Security.Principal.WindowsIdentity).Impersonate()){ 
     //your proxy call here  }

それでもこの方法でnullが発生する場合は、プロキシにデフォルトのクレデンシャルを手動で設定する必要があります

于 2012-06-17T18:03:59.810 に答える
0

はい、サービスセキュリティのコンテキストでは...

OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name

于 2012-06-06T20:21:26.773 に答える