承認と認証はかなり新しいので、重要なステップを見逃している可能性があります...多数のリファレンス、ガイド、チュートリアルを見ているだけです。
WebApiConfig で何かをする必要があるかもしれません。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
または、おそらく私の Global.asax で:
public class WebApiApplication : System.Web.HttpApplication
{
private const string RootDocument = "/index.html";
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
protected void Application_BeginRequest(Object sender, EventArgs e)
{
// Stuff to redirect to index.html unless it's an api url
}
}
これは、Angular 2 フロントエンドを備えた .NET Framework 4.5.2 をターゲットとする ASP.Net Web API プロジェクトであり、フロントエンドで手動で何もしません。おそらくそれを行う必要がありますか? ブラウザのローカル ストレージ、セッション ストレージ、および Cookie がすべて空です。
私がアクセスしている SQL Server には、ロールと userId を返す非常に単純なユーザー ログオン メソッドがあり、これをリポジトリで呼び出します。
public static DbUser Logon(AuthUser user)
{
var parameters = new List<SqlParameter>();
{
// Add parameters, get the DbUser (contains role and userId), and return the DbUser
}
}
ログオン フロントエンドは Angular 2 で構築され、次の API メソッドへの送信時にユーザー名とパスワードを使用して HttpPost 呼び出しを行い、ID とプリンシパルを作成し、Thread と HttpContext を設定します。
// POST api/<controller>
[HttpPost]
public TokenUser Post(AuthUser user)
{
var dbUser = DBAccess.Repository.User.Logon(user);
var identity = new ClaimsIdentity();
identity.AddClaim(new Claim(ClaimTypes.Name, "CwRole"));
identity.AddClaim(new Claim(ClaimTypes.Role, dbUser.AccessLevel));
identity.AddClaim(new Claim(ClaimTypes.UserData, dbUser.ID.ToString()));
var principal = new ClaimsPrincipal(identity);
Thread.CurrentPrincipal = principal;
if (HttpContext.Current != null)
HttpContext.Current.User = principal;
// Other stuff and a return statement =>
// Note I'm not actually doing anything manually with the token on the front end
// which may be why I'm not seeing it in the debugger's Resources tab...
}
そのコードをステップ実行すると、Thread.CurrentPrincipal と HttpContext.Current.User の両方が設定されていることがはっきりとわかります。
しかし、アクションを [Authorize] 属性で装飾すると、ログインしているかどうかに関係なくアクセスできなくなります。
// Works fine
public IEnumerable<ItemGroup> Get()
{
return DBAccess.Repository.Item.GetItemGroups();
}
// Responds with 401 (Unauthorized) no matter what
[Authorize]
public IEnumerable<RequestItem> Get()
{
return DBAccess.Repository.Item.GetRequestItems();
}
したがって、これらのメソッドを作成し、上記のログオンプロセスの後にブラウザーの URL を介してアクセスし、ステップスルーしましたが、ユーザーが実際に設定されていないことがわかりました (クレームはすべて空などです...)。
public class AuthController : ApiController
{
public bool Get()
{
// Stepping through, looks like User.Identity is not even set...
var authenticated = User.Identity.IsAuthenticated;
return authenticated;
}
public bool Get(string role)
{
// As a matter of fact, User doesn't have any claims or anything...
var user = User;
return user != null && user.IsInRole(role);
}
}
設定後にプリンシパルにアクセスできるようにするために、どのステップが欠けていますか? WebApi の組み込みの「ユーザー」メソッド以外でアクセスするか、構成に何かを設定するか、フロントエンドで手動で何かを行う必要がありますか?