web-dev-qa-db-ja.com

.net WebAPI。アクセストークンからユーザープロパティ(ユーザーID)を取得するにはどうすればよいですか?現在のユーザー/トークンに基づいてハンドラーコードをリクエストする

ユーザーベースのアプリケーション用の.netWebAPIサーバーがあるとします。ユーザーはサーバーに送信されるユーザー名とパスワードを使用してアプリケーションにログインし、アプリにはアクセストークンが返されます。

ここで、アプリはユーザー情報の一部を表示したいと考えています(サーバーのDBに保存されています)。そのため、サーバーに対してhttpリクエストを行い、ヘッダーにアクセストークンを含めます。

サーバーがその特定のユーザーの関連情報のみをアプリケーションに返送し、他のユーザーの情報は返送しないように制限するにはどうすればよいですか。

ユーザー名とパスワードを受け取り、返送するトークンを作成しているときに、ユーザーIDをそのトークンに関連付ける方法はありますか?したがって、/ GetUserFoodPreferencesのようなものへのリクエストを受け取ったときに、トークンからuserIdを取得し、そのIDに基づいてデータベースにクエリを実行できます。

これは正しいアプローチですか?

9
user3489727

これを試して:

プロジェクトで、_Providers/ApplicationOAuthProvider.cs_に移動し、メソッドpublic override Task TokenEndpoint(OAuthTokenEndpointContext context)を検索して、foreachの後にこの行を追加します。

_context.AdditionalResponseParameters.Add ("userID" context.Identity.GetUserId());
_

コードは次のようになります。

_public override Task TokenEndpoint(OAuthTokenEndpointContext context)
{
    foreach (KeyValuePair<string, string> property in context.Properties.Dictionary)
    {
        context.AdditionalResponseParameters.Add(property.Key, property.Value);
    }

    context.AdditionalResponseParameters.Add("userID",context.Identity.GetUserId());

    return Task.FromResult<object>(null);
}
_
10
Aldogeno

ユーザーID、またはそのユーザーに接続されている他の種類のIDをCookieに保存するのが最も一般的な方法です。次に、そのCookie(Request.Cookies ["name"];)でIDを調べて、ユーザーを確認できます。

編集:もちろん、APIコントローラーを使用していて、ユーザーを正しく認証している場合は、次を使用できます。

HttpContext.Current.User.Identity.GetUserId();

注:import Microsoft.AspNet.Identityライブラリを忘れないでください。

8
RattyLaa

カスタマイズされたOAuthProviderを作成することで解決する同様の問題があります。

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
{
    private readonly IYourLoginLogic _loginLogic;

    /// <summary>
    /// Constructor
    /// </summary>
    public ApplicationOAuthProvider(IYourLoginLogic loginLogic)
    {
        _loginLogic = loginLogic;
    }

    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        context.Validated();
        return Task.FromResult<object>(null);
    }

    /// <summary>
    /// Login the user with username and password.
    /// </summary>
    /// <param name="context">OAuthGrantResourceOwnerCredentialsContext</param>
    /// <returns>Not used</returns>
    public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        bool loginRst = _loginLogic.Login(context.UserName, context.Password);

        if(!loginRst)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
        }
        else
        {
            var identity = new ClaimsIdentity(context.Options.AuthenticationType);
            identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
            identity.AddClaim(new Claim("role", "user"));
            context.Validated(identity);
        }

        return Task.FromResult<object>(null);
    }

このようにして、ユーザー名はクライアントに返されるトークンに含まれます。クライアントがトークンを使用してリクエストを送り返すと、次のようにリクエストのコンテキストからユーザー名を取得できます。

public class CustomizedAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        base.OnAuthorization(actionContext);

        string username = actionContext.RequestContext.Principal.Identity.Name;
        // do something with the username
    }
}

保護するコントローラーまたはアクションには、CustomizedAuthrize属性を使用する必要があります。

私の場合、次のようになります。

[CustomizedAuthorize]
public sealed class MyController : ApiController {......}
2
Yang Zhang