私は3つのアプリを持っています。トークンを生成するOAuth2.0認証サーバー、トークンを要求するOAuthクライアント、RestfulAPIを提供するOAuthリソースサーバー。これらはすべてMVC3Webアプリケーションです。私の質問は、クライアントからOAuthリソースサーバーに到着したアクセストークンを検証する方法ですか?たとえば、OAuthクライアントはアクセストークンを使用してOAuthサーバーから応答を受信しました。次に、クライアントはこのトークンをヘッダーに追加してから、OAuthリソースサーバーにAPI関数の1つを呼び出すように要求しました。ヘッダー[認証]にアクセストークンが表示されていても、このトークンを検証する方法が見つかりません。私はMVC3を使用してAreaを介してRestfulAPIを設計しているため、SOAPWebサービスで使用されていた以下の関数を使用できません。
private static IPrincipal VerifyOAuth2(HttpRequestMessageProperty httpDetails, Uri requestUri, params string[] requiredScopes) {
// for this sample where the auth server and resource server are the same site,
// we use the same public/private key.
using (var signing = PixidoRest.MvcApplication.CreateAuthorizationServerSigningServiceProvider())
{
using (var encrypting = PixidoRest.MvcApplication.CreateResourceServerEncryptionServiceProvider())
{
var resourceServer = new ResourceServer(new StandardAccessTokenAnalyzer(signing, encrypting));
return resourceServer.GetPrincipal(httpDetails, requestUri, requiredScopes);
}
}
}
「HttpRequestMessageProperty」をパスできないため、クライアントから受け取ったAccesTokenを検証するためにそこでスタックしています。OAuthクライアントのリソースサーバーとしてMVC3Restful APIアプリケーションでこれを検証するにはどうすればよいですか?
これが私の他のコードです:
internal static RSACryptoServiceProvider CreateResourceServerEncryptionServiceProvider()
{
var resourceServerEncryptionServiceProvider = new RSACryptoServiceProvider();
resourceServerEncryptionServiceProvider.ImportParameters(ResourceServerEncryptionPrivateKey);
return resourceServerEncryptionServiceProvider;
}
/// <summary>
/// Creates the crypto service provider for the authorization server that contains the public key used to verify an access token signature.
/// </summary>
/// <returns>An RSA crypto service provider.</returns>
internal static RSACryptoServiceProvider CreateAuthorizationServerSigningServiceProvider()
{
var authorizationServerSigningServiceProvider = new RSACryptoServiceProvider();
authorizationServerSigningServiceProvider.ImportParameters(AuthorizationServerSigningPublicKey);
return authorizationServerSigningServiceProvider;
}
public class RequireAuthorization : ActionFilterAttribute
{
public string Scope { get; set; }
public override void OnActionExecuting(ActionExecutingContext actionContext)
{
string[] scope = null;
if (!string.IsNullOrEmpty(Scope))
{
scope = Scope.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);
}
var query = actionContext.RequestContext.HttpContext.Request;
var req = actionContext.HttpContext;
var authvalue = query.Headers["Authorization"];
OAuthAuthorizationManager.VerifyOAuth2(query, query.Url.AbsoluteUri);
//var response = new HttpResponseMessageProperty()
//{
//here is my question.
//};
base.OnActionExecuting(actionContext);
//redirect page to
//if (CheckUrCondition)
//{
//actionContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
//{
// controller = "Home",
// action = "Index"
//}));
////}
}
前もって感謝します。