2

基本認証と、JSONがAPIに取得/投稿するasp.net Web-Apiを使用して、ユーザー名/パスワードがメンバーシップテーブルに存在することを確認する必要があります。以下のコードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Security;

namespace MvcApplication4.Filter
{
    public class BasicAuthenticationAttribute : System.Web.Http.Filters.ActionFilterAttribute
    {
        public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            if (actionContext.Request.Headers.Authorization == null)
            {
                actionContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
            }
            else
            {
                string authToken = actionContext.Request.Headers.Authorization.Parameter;
                string decodedToken = Encoding.UTF8.GetString(Convert.FromBase64String(authToken));
                string username = decodedToken.Substring(0, decodedToken.IndexOf(":"));
                string password = decodedToken.Substring(decodedToken.IndexOf(":") + 1);

                if (Membership.Provider.ValidateUser(username, password))
                {
                    // User exists in the membership table
                }
                else
                {
                    // User doesn't exist - so return Unathorized
                    actionContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
                }
            }
        }
    }
}

他のコントローラーのユーザー名を参照して、ユーザーがクエリを許可されている車を示すルックアップテーブルにもユーザー名が存在することを確認する必要があります。データベースにテーブルがあり、関連するクラスがあります。

public class ApiMembers
    {
        public int id { get; set; }
        public string UserName { get; set; }
        public int car_id { get; set; }
    }


 [BasicAuthentication]
        public IEnumerable<Cars> GetCars(long id)
        {
            var auth = dba.ApiMembers.Select(a => a.car_id == id && a.UserName=***AuthorisedUserName***).FirstOrDefault();
            if (auth == null || !auth.Any())
                 {
                        throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Unauthorized));
                 }
            else
            {
                // User exists in table, so give them info on car
            }

私の質問は、HTTPヘッダーを再度読み取る必要なしに、UserNameをAuthorizedUserName部分に取得するにはどうすればよいですか?BasicAuthenticationフィルターでユーザーを「ログイン」する方法はありますか、それともWebフォームのようにセッション変数を使用できますか?または、他のコントローラーで誰が認証されたかを知るためのより良い方法はありますか?

4

1 に答える 1

3

現在のプリンシパルを設定できます。

if (Membership.Provider.ValidateUser(username, password))
{
    // User exists in the membership table
    var identity = new GenericIdentity(username);
    Thread.CurrentPrincipal = new GenericPrincipal(identity, null);
}

これで、ApiController内で、Userプロパティを使用して、現在接続されているユーザー名にアクセスできます(このプロパティは、ASP.NET MVC 4 RCで追加されました。以前のバージョンでは、Request.GetPrincipal拡張メソッドを使用できました)。

[BasicAuthentication]
public HttpResponseMessage Get()
{
    string username = User.Identity.Name;

    ...
}
于 2012-06-21T10:20:14.563 に答える