ユーザーベースのアプリケーション用の.netWebAPIサーバーがあるとします。ユーザーはサーバーに送信されるユーザー名とパスワードを使用してアプリケーションにログインし、アプリにはアクセストークンが返されます。
ここで、アプリはユーザー情報の一部を表示したいと考えています(サーバーのDBに保存されています)。そのため、サーバーに対してhttpリクエストを行い、ヘッダーにアクセストークンを含めます。
サーバーがその特定のユーザーの関連情報のみをアプリケーションに返送し、他のユーザーの情報は返送しないように制限するにはどうすればよいですか。
ユーザー名とパスワードを受け取り、返送するトークンを作成しているときに、ユーザーIDをそのトークンに関連付ける方法はありますか?したがって、/ GetUserFoodPreferencesのようなものへのリクエストを受け取ったときに、トークンからuserIdを取得し、そのIDに基づいてデータベースにクエリを実行できます。
これは正しいアプローチですか?
これを試して:
プロジェクトで、_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);
}
_
ユーザーID、またはそのユーザーに接続されている他の種類のIDをCookieに保存するのが最も一般的な方法です。次に、そのCookie(Request.Cookies ["name"];)でIDを調べて、ユーザーを確認できます。
編集:もちろん、APIコントローラーを使用していて、ユーザーを正しく認証している場合は、次を使用できます。
HttpContext.Current.User.Identity.GetUserId();
注:import Microsoft.AspNet.Identity
ライブラリを忘れないでください。
カスタマイズされた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 {......}