4

Web Api で ASP.NET MVC 4 を使用しています

次の ApiController があります。

public class ProductsController : ApiController
{
    public List<Product> GetProducts()
    {
        return _productService.GetAllProducts();
    }

    public List<Product> GetProductsFromId(string username)
    {
        return _productService.GetProductsFromUsername(username);
    }
}

ここで 2 番目のアクションが表示された場合は、GetProductsFromId(string username)以前 (つまり、MVC 3 からアップグレードする前) にUser.Identity.Usernameユーザー名を取得するために使用していたユーザー名を渡す必要があります。

このようなシナリオでは、これをどのように処理すればよいでしょうか。

ユーザー名を渡すにはどうすればよいですか? 私にできることはありますか?

User.Identity.Usernameまた、メソッド内で使用したくGetProductFromId(string username)ありません.Web APIを使用する目的全体が無効になり、テストもできなくなります。

これについて私を助けてください。ありがとう

4

2 に答える 2

13

また、GetProductFromId(string username) メソッド内で User.Identity.Username を使用したくありません。これは、Web API を使用する目的全体を無効にし、テストもできないためです。

それはまさにあなたが使うべきものです:

[Authorize]
public List<Product> GetProductsFromId()
{
    string username = User.Identity.Name;
    return _productService.GetProductsFromUsername(username);
}

[Authorize]属性に注意してください。使用している認可スキームに応じて、User.Identity異なる方法で移入されます。たとえば、フォーム認証を有効にしている場合、ユーザー名は明らかに、アクションを呼び出すときにクライアントが渡す必要があるフォーム認証 Cookie から取得されます。たとえば、フォーム認証の代わりに基本認証を使用している場合は、カスタム ハンドラーを作成することもできます。ここに例を書きました。

これは単体テストの目的を損なうものではありません。このメソッドは完全にユニットテスト可能です。ApiControllerUserプロパティは、単体テストで簡単にモックできる です。たとえば、Moq の場合:IPrincipal

// arrange
var sut = new ProductsController();
var user = new Mock<IPrincipal>();
var identity = new Mock<IIdentity>();
user.Setup(x => x.Identity).Returns(identity.Object);
identity.Setup(x => x.Name).Returns("john");
Thread.CurrentPrincipal = user.Object;

// act
var actual = sut.GetProductsFromId();

// assert
...
于 2012-10-03T08:59:14.147 に答える