5

汎用プリンシパルを設定する次のコードがあります。

public class AuthenticationHandler: DelegatingHandler
{
    protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
                                                                                  CancellationToken cancellationToken)
    {
        var accessToken = request.Headers.Authorization;
        if (accessToken == null)
            return base.SendAsync(request, cancellationToken);

        // Catch an error with regards to the accessToken being invalid
        try
        {
            var formsAuthenticationTicket = FormsAuthentication.Decrypt(accessToken.Parameter);

            if (formsAuthenticationTicket == null)
                return base.SendAsync(request, cancellationToken);

            var data = formsAuthenticationTicket.UserData;
            var userData = JsonConvert.DeserializeObject<LoginRoleViewModel>(data);

            var identity = new GenericIdentity(userData.Id.ToString(), "Basic");

            var userRole = userData.Roles.ToArray();
            var principal = new GenericPrincipal(identity, userRole);
            Thread.CurrentPrincipal = principal;
            HttpContext.Current.User = principal;

        }
        catch (Exception ex)
        {
            var responseMessage = request.CreateResponse(HttpStatusCode.BadRequest, new { ex.Message }); // return ex for full stacktrace
            return Task<HttpResponseMessage>.Factory.StartNew(() => responseMessage);
        }

        return base.SendAsync(request, cancellationToken);
    }

}

以下はコントローラの例です

[Authorize(Roles = "Administrator, Customers")]
[HttpGet("customers/{id}")]
public CustomerViewModel GetCustomer(string id)
{
    var param = AuthService.CheckPermission(Request, User, id);
    var customer = Db.Customers.Find(param);
    return Mapper.Map<CustomerViewModel>(customer);
}

そして、これは私がユーザーの役割かどうかを確認する場所です

public int CheckPermission(HttpRequestMessage request, IPrincipal user, string param)
{
    if (user.IsInRole("Customers") || user.IsInRole("Dealerships"))
    {
        if (param == null || param != "me")
            throw new HttpResponseException(request.CreateErrorResponse(HttpStatusCode.Forbidden, "unauthorized request"));
        param = user.Identity.Name;
    }

    return Convert.ToInt32(param);
}

これは、Web Api 2 および MVC 5 にアップグレードする前に完全に機能していましたか? ユーザーには役割も ID もありません。私が気付いていない変更はありますか?

4

4 に答える 4

10

なぜ機能しなくなったのかはわかりませんが、Web API 2 にはプロパティHttpRequestContextを持つ新しいクラスがPrincipalあり、それを更新するために設定する必要がありますPrincipal。リクエストからコンテキスト オブジェクトにアクセスできます。

于 2013-10-18T11:28:45.327 に答える
6

何年にもわたる安定性の後にこの機能が変更された理由については、本当に不確かです.

以下の作品が見つかりました

request.GetRequestContext().Principal = new GenericIdentity(userData.Id.ToString(), "Basic");

これも機能し、関数のメンバーを設定していないため、IMO は美的に優れています。

HttpContext.Current.User = new GenericIdentity(userData.Id.ToString(), "Basic");
于 2013-10-28T17:53:52.623 に答える
0

「基本」を「フォーム」に変更

var identity = new GenericIdentity(userData.Id.ToString(), "Forms");

また、FormsAuthenticationModule を使用していますか? MVC5 は、このモジュールを介してフォーム認証をサポートします。ここにある例を確認して ください http://msdn.microsoft.com/en-us/library/system.web.security.formsauthenticationmodule.aspx

説明と ID の割り当てに FormsAuthentication_OnAuthenticate を使用することをお勧めします。

http://blogs.msdn.com/b/webdev/archive/2013/07/03/understanding-owin-forms-authentication-in-mvc-5.aspx も参照してください。

于 2013-10-18T13:05:42.827 に答える